В чем разница Promise.all и Promise.allSettled в JavaScript и что происходит если один промис падает
Что проверяют
Понимаете ли вы, что происходит с остальными операциями при падении одной. Именно на этом месте в реальном коде появляются незамеченные ошибки.
Как отвечать
Promise.all отклоняется целиком при первой же неудаче и отдаёт причину этой неудачи. Результаты успешных промисов теряются, потому что результат один на всех.
Promise.allSettled ждёт завершения всех и никогда не отклоняется. Возвращает массив объектов с полем status, где у успешных есть value, а у неудачных reason.
const results = await Promise.allSettled([loadUser(), loadOrders(), loadPromos()]);
const ok = results.filter((r) => r.status === "fulfilled").map((r) => r.value);Критично важная деталь, которую и хотят услышать: отклонение Promise.all не отменяет остальные промисы. Операции уже запущены и продолжают выполняться, просто их результат никого не интересует. Если один из них тоже упадёт, получится необработанное отклонение, и в Node это может уронить процесс. Настоящая отмена делается через AbortController, промисы сами по себе не отменяемы.
Рядом стоит назвать соседей: Promise.race завершается первым завершившимся промисом, Promise.any первым успешным (а если все упали, отдаёт AggregateError).
Правило выбора: нужны все данные и без любого куска смысла нет, берём all; нужно показать что получилось и отдельно сообщить, что не загрузилось, берём allSettled.
Где спотыкаются
Ждут, что Promise.all дождётся остальных и вернёт частичный результат.
Считают, что при отклонении остальные запросы отменяются.
Оборачивают каждый промис в catch, возвращающий undefined, и потом не отличают «нет данных» от «была ошибка». allSettled решает это честнее.