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

AbortSignal.timeout

Вопрос

Как в Node 22 сделать fetch с таймаутом 3 секунды, который реально прерывает запрос?

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

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

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

Коротко

Правильный ответ: fetch(url, { signal: AbortSignal.timeout(3000) }). AbortSignal.timeout(ms) создаёт сигнал, который сам прерывается через заданное время. fetch отменяет запрос и отклоняется с ошибкой TimeoutError. - Опции timeout у стандартного fetch нет, она будет проигнорирована. - Метода fetch.cancel не…

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

  1. fetch(url, { timeout: 3000, keepalive: false })
  2. await Promise.race([fetch(url), sleep(3000)]) с отменой
  3. setTimeout(() => fetch.cancel(), 3000)
  4. fetch(url, { signal: AbortSignal.timeout(3000) })правильный ответ

Разбор

AbortSignal.timeout(ms) создаёт сигнал, который сам прерывается через заданное время. fetch отменяет запрос и отклоняется с ошибкой TimeoutError.

  • Опции timeout у стандартного fetch нет, она будет проигнорирована.
  • Метода fetch.cancel не существует.
  • race со sleep не прерывает запрос и к тому же вернёт результат sleep как «успех».

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

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

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