454просмотров
15 декабря 2024 г.
Score: 499
💟 Promise API
В классе Promise есть 4 статических методов для управления несколькими промисами: 🔮 Promise.all
Допустим, нам нужно запустить множество промисов параллельно и дождаться, пока все они выполнятся.
Для этого как раз и пригодится Promise.all.
Метод Promise.all принимает массив промисов (может принимать любой перебираемый объект, но обычно используется массив) и возвращает новый промис.
Новый промис завершится, когда завершится весь переданный список промисов, и его результатом будет массив их результатов.
Promise.all([ new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1 new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2 new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
]).then(console.log); // когда все промисы выполнятся, результат будет 1,2,3
// каждый промис даёт элемент массива
// порядок элементов массива в точности соответствует порядку исходных промисов
Если любой из промисов завершится с ошибкой, то промис, возвращённый Promise.all, немедленно завершается с этой ошибкой.
Promise.all([ new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)), new Promise((resolve, reject) => setTimeout(() => reject(("Ошибка!")), 2000)), new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).catch(console.log); // Ошибка!
Если один промис завершается с ошибкой, то весь Promise.all завершается с ней, полностью забывая про остальные промисы в списке. Их результаты игнорируются. 🔮 Promise.allSettled
Метод Promise.allSettled всегда ждёт завершения всех промисов. В массиве результатов будет
{status:"fulfilled", value:результат} для успешных завершений,
{status:"rejected", reason:ошибка} для ошибок.
Пример:
Promise.allSettled([ new Promise((resolve, reject) => { setTimeout(()=>resolve('1'), 1000); }), new Promise((resolve, reject) => { setTimeout(()=>resolve('2'), 2000); }), new Promise((resolve, reject) => { setTimeout(()=>reject('Error'), 1000); }), new Promise((resolve, reject) => { setTimeout(()=>resolve('3'), 3000); }), new Promise((resolve, reject) => { setTimeout(()=>resolve('4'), 500); }),
]).then(result => console.log(result))
Получим:
[ { status: 'fulfilled', value: '1' }, { status: 'fulfilled', value: '2' }, { status: 'rejected', reason: 'Error' }, { status: 'fulfilled', value: '3' }, { status: 'fulfilled', value: '4' }
] 🔮 Promise.any
Promise.any используется, чтобы дождаться успешного выполнения первого промиса из массива. Игнорирует промисы, которые отклоняются, и возвращает перый успешный результат.
Promise.any([ new Promise((resolve, reject) => { setTimeout(() => resolve('1'), 1000); }), new Promise((resolve, reject) => { setTimeout(() => resolve('2'), 2000); }), new Promise((resolve, reject) => { setTimeout(() => reject('Error'), 500); })]).then(result => console.log(result);)
// Выводит '1' через 1с, так как это первый успешно выполненный промис
Зачем нужно: Это полезно, когда вам нужно получить первый успешный результат из группы асинхронных операций, игнорируя все ошибки. 🔮 Promise.race
Promise.race возвращает промис, который завершится, как только один из входящих промисов выполнится или отклонится. Он возвращает результат первого завершённого промиса, независимо от его состояния (успех или ошибка). Promise.race([ new Promise((resolve, reject) => { setTimeout(() => resolve('1'), 1000); }), new Promise((resolve, reject) => { setTimeout(() => resolve('2'), 2000); }), new Promise((resolve, reject) => { setTimeout(() => reject('Error'), 1000); })]).then(result => console.log(result);)
// Выводит '1' через 1с, так как это первый завершённый промис
Зачем нужно: Это полезно для сценариев, когда необходимо реагировать на первое завершение операции, будь то успешное выполнение или ошибка. #javascript
#angula