Lucrul cu matrice de promisiuni în JavaScript
Acum vom analiza două metode utile,
care permit lucrul cu matrice de promisiuni.
Metoda Promise.all permite executarea
codului după finalizarea tuturor promisiunilor,
transmise acestuia sub formă de matrice, iar metoda Promise.race
așteaptă încărcarea primei promisiuni din matrice,
eliminând restul.
Ambele metode returnează ca rezultat o nouă
promisiune. Pentru metoda Promise.all rezultatul
acestei promisiuni va fi o matrice cu rezultatele tuturor
promisiunilor transmise (ordinea rezultatelor
corespunde ordinii promisiunilor în matrice),
iar pentru Promise.race - rezultatul primei
promisiuni care s-a finalizat.
Să vedem în practică. Să presupunem că avem o matrice de promisiuni:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Să folosim Promise.all pentru a aștepta
finalizarea încărcării tuturor promisiunilor din
matricea noastră:
Promise.all(promises).then(function(res) {
console.log(res); // va afișa [1, 2, 3] - rezultatele tuturor promisiunilor
});
Acum să folosim Promise.race pentru a aștepta
finalizarea încărcării primei promisiuni:
Promise.race(promises).then(function(res) {
console.log(res); // va afișa 1 - rezultatul primei promisiuni care s-a finalizat
});
Dacă cel puțin una dintre promisiunile din matrice va fi
respinsă, atunci promisiunea cu rezultat va
trece imediat în starea rejected. Prin urmare,
excepția apărută poate fi prinsă în mod obișnuit,
deja studiat de dvs., de exemplu, prin
catch:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
Creați o funcție care returnează o promisiune, în interiorul
căreia este setată o întârziere aleatorie de la
1 până la 10 secunde. Fie ca
rezultat promisiunea să returneze această întârziere.
Cu ajutorul unei bucle și a funcției dvs., umpleți
matricea cu 10 promisiuni.
Folosind matricea de promisiuni din sarcina anterioară, faceți astfel încât în consolă să fie afișat rezultatul primei promisiuni care s-a finalizat.
Folosind matricea de promisiuni din sarcina anterioară, faceți astfel încât în consolă să fie afișată suma rezultatelor tuturor promisiunilor.