Skip to main content

Що робить Promise.all()?

Що робить Promise.all()

Promise.all() - це метод класу Promise, який приймає масив (або будь-який ітерований об'єкт) промісів і повертає новий проміс, який:

  • виконується успішно, коли всі проміси всередині масиву успішно завершилися (fulfilled);
  • відхиляється (rejected), щойно перший проміс завершився з помилкою.

Синтаксис

javascript
Promise.all(iterable)

де iterable - це, як правило, масив промісів:

javascript
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));

Результат:

javascript
["A", "B", "C"]

Як це працює

  1. Всі проміси всередині Promise.all([...]) запускаються паралельно. (точніше - вони починають виконуватися незалежно один від одного).
  2. Promise.all() чекає на їх завершення.
  3. Якщо всі успішні -> повертається новий проміс у стані fulfilled, і його значення - це масив результатів у тому самому порядку, що й вхідні проміси.

Приклад із затримками

javascript
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 секунди:

javascript
Результати: [ 'Перший', 'Другий', 'Третій' ]

Зверни увагу: результати в тому самому порядку, у якому були передані проміси, а не в порядку завершення.


Що станеться, якщо один із промісів відхилиться

Якщо хоча б один проміс всередині Promise.all перейде в стан rejected, то весь Promise.all() негайно відхилиться, і результатом буде перша перехоплена помилка.

Приклад:

javascript
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));

Вивід:

javascript
Помилка!

Решта промісів (p3) все одно виконаються, але результати ігноруються, оскільки Promise.all() вже перейшов у стан rejected.


Важливо: результати зберігаються в порядку передачі

Навіть якщо один проміс виконується довше, результати будуть упорядковані за позицією:

javascript
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():

javascript
Promise.all([42, Promise.resolve('OK')]) .then(console.log); // [42, "OK"]

Як обробити помилки, не перериваючи виконання

Якщо потрібно, щоб всі проміси виконалися незалежно, і помилки не переривали виконання - використовуй Promise.allSettled().

javascript
Promise.allSettled([ Promise.resolve('OK'), Promise.reject('Помилка'), Promise.resolve('Ще OK') ]).then(console.log);

Вивід:

javascript
[ { 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()Повертає результат першого завершеного промісуМоже бути успіх або помилка-

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.