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

Как отменить fetch

Вопрос

Пользователь ушёл со страницы, нужно отменить незавершённый fetch. Как это сделать?

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

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

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

Коротко

Правильный ответ: Передать в fetch signal от AbortController и вызвать abort(). fetch(url, { signal: controller.signal }) подписывается на сигнал отмены; controller.abort() прерывает запрос, и промис отклоняется с AbortError.

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

  1. Вызвать promise.cancel() у промиса, который вернул fetch
  2. Передать в fetch signal от AbortController и вызвать abort()правильный ответ
  3. Присвоить промису null: сборщик мусора сам остановит запрос
  4. Вызвать Promise.reject() с этим промисом, чтобы он отклонился

Разбор

fetch(url, { signal: controller.signal }) подписывается на сигнал отмены; controller.abort() прерывает запрос, и промис отклоняется с AbortError. У стандартных промисов нет метода cancel. Потеря ссылки на промис ничего не отменяет: запрос держит окружение. Promise.reject(p) создаёт новый отклонённый промис и на исходный никак не влияет. Для таймаута удобен AbortSignal.timeout(5000).

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

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

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