Сейчас мы с вами разберем два полезных метода,
позволяющих работать с массивами промисов.
Метод 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
-ю промисами.
Используя массив промисов из предыдущей задачи сделайте так, чтобы в консоль вывелся результат первого сработавшего промиса.
Используя массив промисов из предыдущей задачи сделайте так, чтобы в консоль вывелась сумма результатов всех промисов.