Существует новый API для выполнения запросов из JavaScript: fetch (). Есть ли встроенный механизм для отмены этих запросов в полете?
javascript
ajax
fetch-api
Сэм Ли
источник
источник
Ответы:
TL / DR:
fetch
теперь поддерживаетsignal
параметр по состоянию на 20 сентября 2017 года, но не все браузеры в настоящее время поддерживают это .ОБНОВЛЕНИЕ 2020: большинство основных браузеров (Edge, Firefox, Chrome, Safari, Opera и некоторые другие) поддерживают функцию , которая стала частью стандарта жизни DOM . (по состоянию на 5 марта 2020 года)
Это изменение мы увидим очень скоро, и поэтому вы сможете отменить запрос, используя
AbortController
sAbortSignal
.Длинная версия
Как:
Вот как это работает:
Шаг 1 : Вы создаете
AbortController
(пока я только что использовал это )const controller = new AbortController()
Шаг 2 : Вы получаете
AbortController
сигнал s следующим образом:const signal = controller.signal
Шаг 3 : Вы передаете,
signal
чтобы получить вот так:Шаг 4 : Просто прерывайте всякий раз, когда вам нужно:
controller.abort();
Вот пример того, как это будет работать (работает на Firefox 57+):
Источники:
источник
AbortController is not defined
. В любом случае, это всего лишь подтверждение концепции, по крайней мере, люди с Firefox 57+ могут увидеть, как это работаетhttps://developers.google.com/web/updates/2017/09/abortable-fetch
https://dom.spec.whatwg.org/#aborting-ongoing-activities
работает в версии 16 (2017-10-17), Firefox 57 (2017-11-14), настольное Safari 11.1 (2018-03-29), IOS Safari 11.4 (2018-03-29), Chrome 67 (2018-05 -29) и позже.
в более старых браузерах вы можете использовать github's polyfill whatwg-fetch и AbortController polyfill . Вы можете обнаружить старые браузеры и использовать полифиллы также условно :
источник
По состоянию на февраль 2018 года
fetch()
его можно отменить с помощью приведенного ниже кода в Chrome (см. « Использование читаемых потоков», чтобы включить поддержку Firefox). Никаких ошибок не возникаетcatch()
, и это временное решение, пока оно неAbortController
будет полностью принято.источник
Пока что нет правильного решения, как говорит @spro.
Однако, если у вас есть ответ в полете и вы используете ReadableStream, вы можете закрыть поток, чтобы отменить запрос.
источник
Давайте полифилл:
Пожалуйста, имейте в виду, что код не проверен! Дайте мне знать, если вы проверили это и что-то не сработало. Он может предупредить вас, что вы пытаетесь перезаписать функцию 'fetch' из официальной библиотеки JavaScript.
источник