Що робить Promise.all()?
Що робить Promise.all()
Promise.all() - це метод класу Promise, який приймає масив (або будь-який ітерований об'єкт) промісів і повертає новий проміс, який:
- виконується успішно, коли всі проміси всередині масиву успішно завершилися (
fulfilled); - відхиляється (rejected), щойно перший проміс завершився з помилкою.
Синтаксис
Promise.all(iterable)де iterable - це, як правило, масив промісів:
const p1 = Promise.resolve('A');
const p2 = Promise.resolve('B');
const p3 = Promise.resolve('C');
Promise.all([p1, p2, p3]).then(values => console.log(values));Результат:
["A", "B", "C"]Як це працює
- Всі проміси всередині
Promise.all([...])запускаються паралельно. (точніше - вони починають виконуватися незалежно один від одного). Promise.all()чекає на їх завершення.- Якщо всі успішні -> повертається новий проміс у стані
fulfilled, і його значення - це масив результатів у тому самому порядку, що й вхідні проміси.
Приклад із затримками
const p1 = new Promise(res => setTimeout(() => res('Перший'), 1000));
const p2 = new Promise(res => setTimeout(() => res('Другий'), 2000));
const p3 = new Promise(res => setTimeout(() => res('Третій'), 500));
Promise.all([p1, p2, p3])
.then(results => console.log('Результати:', results))
.catch(err => console.error('Помилка:', err));Вивід приблизно через 2 секунди:
Результати: [ 'Перший', 'Другий', 'Третій' ]Зверни увагу: результати в тому самому порядку, у якому були передані проміси, а не в порядку завершення.
Що станеться, якщо один із промісів відхилиться
Якщо хоча б один проміс всередині Promise.all перейде в стан rejected,
то весь Promise.all() негайно відхилиться,
і результатом буде перша перехоплена помилка.
Приклад:
const p1 = Promise.resolve('OK');
const p2 = Promise.reject('Помилка!');
const p3 = Promise.resolve('Ще OK');
Promise.all([p1, p2, p3])
.then(results => console.log(results))
.catch(err => console.error(err));Вивід:
Помилка!Решта промісів (p3) все одно виконаються,
але результати ігноруються,
оскільки Promise.all() вже перейшов у стан rejected.
Важливо: результати зберігаються в порядку передачі
Навіть якщо один проміс виконується довше, результати будуть упорядковані за позицією:
Promise.all([
Promise.resolve('A'),
new Promise(res => setTimeout(() => res('B'), 2000)),
Promise.resolve('C')
]).then(console.log); // ["A", "B", "C"]Якщо передати не-проміси
Promise.all() автоматично "обгортає" звичайні значення в Promise.resolve():
Promise.all([42, Promise.resolve('OK')])
.then(console.log); // [42, "OK"]Як обробити помилки, не перериваючи виконання
Якщо потрібно, щоб всі проміси виконалися незалежно,
і помилки не переривали виконання -
використовуй Promise.allSettled().
Promise.allSettled([
Promise.resolve('OK'),
Promise.reject('Помилка'),
Promise.resolve('Ще OK')
]).then(console.log);Вивід:
[
{ status: "fulfilled", value: "OK" },
{ status: "rejected", reason: "Помилка" },
{ status: "fulfilled", value: "Ще OK" }
]Promise.allSettled() ніколи не відхиляється,
і повертає масив результатів з полями status та value/reason.
Проста аналогія
Уяви, що ти чекаєш 3 доставки:
Promise.all()- ти чекаєш всі посилки одразу. Якщо хоча б одна загубилася, ти скасовуєш усе.Promise.allSettled()- ти чекаєш на всі, навіть якщо одна зламалася - все одно отримуєш звіт про кожну.
ПІДСУМОК
| Метод | Що робить | Успіх | Помилка |
|---|---|---|---|
Promise.all() | Чекає, поки всі проміси виконаються | Повертає масив результатів | Відхиляється при першій помилці |
Promise.allSettled() | Чекає на всі, навіть з помилками | Повертає масив об'єктів {status, value/reason} | - |
Promise.race() | Повертає результат першого завершеного промісу | Може бути успіх або помилка | - |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.