Выбор ответа Middle Промисы и async/await обновлено
Как отменить fetch
Вопрос
Пользователь ушёл со страницы, нужно отменить незавершённый fetch. Как это сделать?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Передать в fetch signal от AbortController и вызвать abort(). fetch(url, { signal: controller.signal }) подписывается на сигнал отмены; controller.abort() прерывает запрос, и промис отклоняется с AbortError.
Варианты ответа
- Вызвать
promise.cancel()у промиса, который вернулfetch - Передать в
fetchsignalотAbortControllerи вызватьabort()правильный ответ - Присвоить промису
null: сборщик мусора сам остановит запрос - Вызвать
Promise.reject()с этим промисом, чтобы он отклонился
Разбор
fetch(url, { signal: controller.signal }) подписывается на сигнал отмены; controller.abort() прерывает запрос, и промис отклоняется с AbortError. У стандартных промисов нет метода cancel. Потеря ссылки на промис ничего не отменяет: запрос держит окружение. Promise.reject(p) создаёт новый отклонённый промис и на исходный никак не влияет. Для таймаута удобен AbortSignal.timeout(5000).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.