Что будет при ошибке выполнения одного из 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.