Promise-taulukoiden käsittely JavaScriptissä
Nyt käymme läpi kaksi hyödyllistä menetelmää,
joiden avulla voidaan työskennellä promise-taulukoiden kanssa.
Menetelmä Promise.all mahdollistaa
koodin suorittamisen kaikkien taulukkoon välitettyjen
promisejen päätyttyä, kun taas menetelmä Promise.race
odottaa taulukon ensimmäisen promiseen latautumista,
hyläten loput.
Molemmat menetelmät palauttavat tuloksenaan uuden
promisen. Menetelmän Promise.all tapauksessa
tämän promisen tulos on taulukko, joka sisältää kaikkien
välitettyjen promisejen tulokset (tulosten järjestys
vastaa promisejen järjestystä taulukossa),
kun taas Promise.race palauttaa ensimmäisen
valmistuneen promisen tuloksen.
Katsotaanpa käytännössä. Oletetaan, että meillä on promise-taulukko:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Odottakaamme Promise.all:n avulla
kaikkien taulukkomme promisejen latautumisen
päättymistä:
Promise.all(promises).then(function(res) {
console.log(res); // tulostaa [1, 2, 3] - kaikkien promisejen tulokset
});
Ja nyt odotetaan Promise.race:n avulla
ensimmäisen promisen latautumisen päättymistä:
Promise.race(promises).then(function(res) {
console.log(res); // tulostaa 1 - ensimmäisen valmistuneen promisen tulos
});
Jos vähintään yksi taulukon promiseista
hylätään, promisen tulos siirtyy välittömästi
tilaan rejected. Siksi
ilmaantuneen poikkeuksen voi siepata tavallisella,
jo opitsellasi tavalla, esimerkiksi
catch:in avulla:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
Tee funktio, joka palauttaa promisen, jonka sisällä
on satunnainen viive 1:stä
10:een sekuntiin. Palauttakoon promisen
tuloksena tämä viive.
Täytä silmukkaa ja funktiotasi käyttäen
taulukko 10:llä promisella.
Käytä edellisen tehtävän promise-taulukkoa tehdäksesi niin, että konsoliin tulostuu ensimmäisen toimineen promisen tulos.
Käytä edellisen tehtävän promise-taulukkoa tehdäksesi niin, että konsoliin tulostuu kaikkien promisejen tulosten summa.