Promise massiivide töötamine JavaScriptis
Praegu analüüsime kahte kasulikku meetodit,
mis võimaldavad töötada promise massiividega.
Meetod Promise.all võimaldab käivitada
koodi pärast kõigi talle massiivina edastatud
promise'ide lõppemist, meetod Promise.race
oodab aga massivist esimese promise'i laadimist,
jättes ülejäänud kõrvale.
Mõlemad meetodid tagastavad oma tulemusena uue
promise'i. Meetodi Promise.all puhul on selle
promise'i tulemuseks kõigi edastatud promise'ide
tulemuste massiiv (tulemuste järjekord
vastab promise'ide järjekorrale massiivis),
Promise.race puhul aga esimesena
käivituva promise'i tulemus.
Vaatame praktikas. Olgu meil promise'ide massiiv:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Kasutame Promise.all, et oodata
kõigi meie massiivi promise'ide
laadimise lõppemist:
Promise.all(promises).then(function(res) {
console.log(res); // väljastab [1, 2, 3] - kõigi promise'ide tulemused
});
Ja nüüd kasutame Promise.race, et oodata
esimese promise'i laadimise lõppemist:
Promise.race(promises).then(function(res) {
console.log(res); // väljastab 1 - esimesena täidetud promise'i tulemus
});
Kui vähemalt üks promise massiivist
läheb tagasi lükatud olekusse, siis promise tulemusega
läheb kohe olekusse rejected. Seetõttu
tekkinud erandi saab püüda tavalisel,
juba teie poolt õpitud viisil, näiteks läbi
catch:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
Tehke funktsioon, mis tagastab promise'i, mille sees
on seatud juhuslik viivitus
1 kuni 10 sekundi vahel. Olgu
promise'i tulemuseks see viivitus.
Kasutades tsüklit ja teie funktsiooni, täitke
massiiv 10 promise'iga.
Kasutades eelmise ülesande promise'ide massiivi tehke nii, et konsooli väljastatakse esimesena käivituva promise'i tulemus.
Kasutades eelmise ülesande promise'ide massiivi tehke nii, et konsooli väljastatakse kõigi promise'ide tulemuste summa.