Работа с масиви от промисове в JavaScript
Сега ще разгледаме два полезни метода,
които позволяват работа с масиви от промисове.
Методът Promise.all позволява изпълнение на
код след приключване на всички промисове, подадени
му под формата на масив, а методът Promise.race
изчаква зареждането на първия промис от масива,
игнорирайки останалите.
И двата метода връщат нов промис като резултат.
За метода Promise.all резултатът от
този промис ще бъде масив от резултатите на всички
подадени промисове (редът на резултатите
съответства на реда на промисовете в масива),
а за Promise.race - резултатът от първия
завършил промис.
Нека да разгледаме на практика. Да предположим, че имаме масив от промисове:
let promises = [
new Promise(resolve => setTimeout(() => resolve(1), 1000)),
new Promise(resolve => setTimeout(() => resolve(2), 2000)),
new Promise(resolve => setTimeout(() => resolve(3), 3000)),
];
Нека с помощта на Promise.all изчакаме
завършването на всички промисове от нашия
масив:
Promise.all(promises).then(function(res) {
console.log(res); // ще изведе [1, 2, 3] - резултатите от всички промисове
});
А сега с помощта на Promise.race изчакаме
завършването на първия от промисовете:
Promise.race(promises).then(function(res) {
console.log(res); // ще изведе 1 - резултатът от първия завършил промис
});
Ако поне един от промисовете в масива бъде
отхвърлен, то промисът с резултата веднага
ще премине в състояние rejected. Следователно
възникналото изключение може да бъде уловено по обичайния,
вече изучен от вас начин, например, чрез
catch:
Promise.all(promises).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
Направете функция, която връща промис, вътре
в който е зададена случайна забавяка от
1 до 10 секунди. Нека своя
резултат промисът връща тази забавяка.
С помощта на цикъл и вашата функция попълнете
масив с 10 промиса.
Използвайки масива от промисове от предходната задача направете така, че в конзолата да се изведе резултатът от първия завършил промис.
Използвайки масива от промисове от предходната задача направете така, че в конзолата да се изведе сумата от резултатите на всички промисове.