PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Что будет при ошибке выполнения одного из Promise переданного в метод Promise.all?

Асинхронность и Event Loop

Если хотя бы один промис в `Promise.all` завершится ошибкой (reject), весь `Promise.all` немедленно отклонится с этой же ошибкой — это поведение fail-fast.

Что происходит

Promise.all ждёт все промисы, но при первой же ошибке:

  • возвращаемый промис сразу переходит в rejected с причиной упавшего промиса;
  • результаты остальных промисов игнорируются (хотя сами промисы не отменяются и продолжают выполняться);
  • в then управление не попадёт, сработает catch.
try {
  const results = await Promise.all([
    Promise.resolve(1),
    Promise.reject(new Error('упал')),
    Promise.resolve(3),
  ]);
} catch (e) {
  console.error(e.message); // 'упал' — весь all отклонён
}

Детали

  • Остальные промисы не отменяются (в JS нет отмены промисов) — их сайд-эффекты произойдут, но результат потеряется.
  • Возвращается ошибка первого отклонившегося промиса.

Если нужно дождаться всех, несмотря на ошибки

Использовать Promise.allSettled — он вернёт массив статусов и не упадёт:

const results = await Promise.allSettled([...]);
// [{status:'fulfilled',value}, {status:'rejected',reason}]

Коротко для собеседования

При ошибке одного промиса Promise.all немедленно отклоняется с этой ошибкой (fail-fast), результаты остальных теряются, срабатывает catch. Остальные промисы не отменяются. Чтобы дождаться всех несмотря на ошибки — Promise.allSettled.

Другие вопросы раздела