Коротка відповідь
juniorPromise.all() — це послідовне виконання, яке повертає Promise, що резолвиться лише після успішного завершення всіх переданих промісів; якщо один з них відхиляється, результатом стає reject. Promise.allSettled() повертає Promise, що резолвиться після завершення всіх промісів незалежно від їх результату, повертаючи масив об’єктів зі статусом і значенням. Обидва методи запускають проміси паралельно, але різниця в обробці результатів.
Повне пояснення
Що це і навіщо
Promise.all()використовується, коли потрібен результат усіх асинхронних операцій і будь-яка помилка має зупинити виконання.Promise.allSettled()потрібен, коли треба дізнатися про стан кожної операції незалежно від успіху чи неуспіху.
Ключові принципи
- Обидва методи приймають ітерований список промісів.
- Паралельне виконання: всі проміси запускаються одночасно, а не послідовно.
- Результат
Promise.all()– масив значень у тому ж порядку, що й проміси. - Результат
Promise.allSettled()– масив об’єктів{status: "fulfilled"|"rejected", value?: any, reason?: any}.
Як це працює
- Кожен проміс запускається одразу.
Promise.all()чекає, доки всі проміси стануть fulfilled; якщо будь‑який reject – повертається reject з першою помилкою.Promise.allSettled()чекає, доки всі проміси стануть settled; повертається масив статусів.
Практика і реалізація
// Promise.all()
Promise.all([fetchA(), fetchB()])
.then(([a, b]) => console.log(a, b))
.catch(err => console.error(err));
// Promise.allSettled()
Promise.allSettled([fetchA(), fetchB()])
.then(results => results.forEach(r => console.log(r.status, r.value || r.reason)));
Тестування
- Використовуючи Jest:
await expect(Promise.allSettled([Promise.resolve(1), Promise.reject('err')])).resolves.toEqual([...]).
Оптимізація, типові помилки та edge cases
- Не використовуйте
Promise.all()для великих масивів, де одна помилка зупинить усі запити. - Для великих наборів даних розгляньте
p-limitабо батч‑обробку. - Перевіряйте, що передані елементи дійсно проміси; інші значення будуть обгорнуті в
Promise.resolve.
Часті помилки
- Очікування
Promise.all()після однієї reject‑помилки. - Необережне використання
await Promise.allSettled()без обробки результатів. - Втрата порядку елементів у масиві результатів.
- Перевантаження мережі одночасними запитами без throttling.
- Необхідність обробки
undefinedу результатах. - Відсутність обробки помилок у
Promise.allSettled(). - Використання
Array.prototype.mapз синхронними функціями, що повертають проміси. - Застосування
Promise.allSettled()там, де потрібен лише перший результат (Promise.race).