JavaScript: Promise.all и Promise.allSettled

Категория: JavaScript · Язык: JavaScript · Обновлено:

Promise.all() ждёт все операции и возвращает результаты в исходном порядке, но отклоняется при первой ошибке. Promise.allSettled() дожидается завершения каждой операции и возвращает статус каждой из них — выбирайте его, когда отдельный сбой не должен скрывать остальные ответы.

Promise.all: все операции обязательны

JavaScript
const loadUser = async (id) => ({id, name: `user-${id}`});
const results = await Promise.all([loadUser(1), loadUser(2)]);
console.log(results.map((item) => item.id).join(',')); // 1,2

Порядок элементов результата соответствует порядку входного массива, даже если операции завершились в другой последовательности.

Promise.allSettled: собрать успехи и ошибки

JavaScript
const results = await Promise.allSettled([
  Promise.resolve('профиль'),
  Promise.reject(new Error('сервис недоступен'))
]);
const summary = results.map((result) => result.status);
console.log(summary.join(',')); // fulfilled,rejected

Для чтения значений проверяйте status: у успешного результата поле value, у ошибки — reason.

JavaScript
const settled = await Promise.allSettled([
  Promise.resolve('профиль'),
  Promise.reject(new Error('сервис недоступен'))
]);
for (const result of settled) {
  if (result.status === 'fulfilled') console.log('Готово:', result.value);
  else console.error('Не удалось загрузить:', result.reason.message);
}

Метод

Когда отклоняется

Что возвращает

Promise.all()

При первом отклонённом Promise

Массив значений

Promise.allSettled()

Не отклоняется из-за результата элементов

Массив объектов со статусами

Как дождаться нескольких независимых запросов?

Используйте Promise.all([fetchA(), fetchB()]), если для ответа нужны оба результата. Если допустим частичный экран, используйте Promise.allSettled() и обработайте каждый статус.

В каком порядке придут результаты?

В порядке Promise во входном массиве, а не в порядке завершения запросов.