Выбор ответа Middle Промисы и async/await обновлено

Что с остальными запросами при ошибке в Promise.all

Вопрос

В Promise.all передали три запроса fetch. Второй упал через 100 мс. Что происходит с первым и третьим?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Они продолжат выполняться, но Promise.all их результаты не вернёт. Promise.all отклоняется сразу при первой ошибке, но остальные операции об этом ничего не знают: промисы не умеют отменяться, запросы дойдут до конца, их результаты будут проигнорированы.

Варианты ответа

  1. Они автоматически отменяются: Promise.all прерывает их fetch
  2. Они продолжат выполняться, но Promise.all их результаты не вернётправильный ответ
  3. Promise.all ждёт их завершения и только потом отклоняется
  4. Они перезапускаются, чтобы Promise.all смог собрать все три ответа

Разбор

Promise.all отклоняется сразу при первой ошибке, но остальные операции об этом ничего не знают: промисы не умеют отменяться, запросы дойдут до конца, их результаты будут проигнорированы. Чтобы реально прервать запросы, передают общий AbortController.signal и вызывают abort() в catch. Ждёт всех Promise.allSettled. Перезапуска нет ни у одного из комбинаторов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме