Выбор ответа Middle Асинхронные паттерны обновлено

Таймаут через Promise.race

Вопрос

Запрос обёрнут в Promise.race([fetch(url), timeout(3000)]), где timeout отклоняется через 3 секунды. Сервер отвечает за 10 секунд. Что происходит с самим запросом после таймаута?

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

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

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

Коротко

Правильный ответ: Он идёт до ответа сервера, результат просто игнорируется. Promise.race лишь выбирает, чей результат вернуть.

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

  1. Он идёт до ответа сервера, результат просто игнорируетсяправильный ответ
  2. Он автоматически прерывается, сокет закрывается
  3. Node бросает исключение внутри fetch и рвёт запрос
  4. Соединение закрывается сборщиком мусора сразу

Разбор

Promise.race лишь выбирает, чей результат вернуть. Проигравшие промисы не отменяются, сокет и память заняты до конца запроса. Чтобы прервать реально, нужно fetch(url, { signal: AbortSignal.timeout(3000) }).

  • Автоматической отмены у промисов нет.
  • Race не влияет на другие промисы.
  • GC не трогает активные соединения.

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

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

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