Lavorare con array di Promise in JavaScript
Ora analizzeremo due metodi utili,
che permettono di lavorare con array di Promise.
Il metodo Promise.all permette di eseguire
il codice al termine di tutte le Promise, passate
ad esso sotto forma di array, mentre il metodo Promise.race
attende il completamento della prima Promise dell'array,
scartando le altre.
Entrambi i metodi restituiscono come risultato una nuova
Promise. Per il metodo Promise.all il risultato
di questa Promise sarà un array con i risultati di tutte
le Promise passate (l'ordine dei risultati
corrisponde all'ordine delle Promise nell'array),
mentre per Promise.race - il risultato della prima
Promise completata.
Vediamo in pratica. Supponiamo di avere un array di Promise:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Utilizziamo Promise.all per attendere
il completamento di tutte le Promise del nostro
array:
Promise.all(promises).then(function(res) {
console.log(res); // visualizzerà [1, 2, 3] - i risultati di tutte le Promise
});
Ora utilizziamo Promise.race per attendere
il completamento della prima delle Promise:
Promise.race(promises).then(function(res) {
console.log(res); // visualizzerà 1 - il risultato della prima Promise completata
});
Se almeno una delle Promise nell'array viene
rigettata, la Promise con il risultato passerà
immediatamente allo stato rejected. Pertanto
l'eccezione generata può essere catturata nel modo
consueto, che avete già studiato, ad esempio, tramite
catch:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
Create una funzione che restituisce una Promise, all'interno
della quale è impostato un ritardo casuale da
1 a 10 secondi. La Promise restituisca come suo
risultato questo ritardo.
Utilizzando un ciclo e la vostra funzione, riempite
un array con 10 Promise.
Utilizzando l'array di Promise della task precedente, fate in modo che in console venga visualizzato il risultato della prima Promise completata.
Utilizzando l'array di Promise della task precedente, fate in modo che in console venga visualizzata la somma dei risultati di tutte le Promise.