如何取消 HTTP fetch() 请求?断续器:长版

2022-08-30 00:21:43

有一个新的API用于从JavaScript发出请求:fetch()。是否有任何内置机制可以在运行中取消这些请求?


答案 1

断续器:

fetch现在支持截至2017年9月20日的参数,但目前并非所有浏览器都支持此功能signal

2020年更新:大多数主流浏览器(Edge,Firefox,Chrome,Safari,Opera和其他一些浏览器)都支持该功能,这已成为DOM生活标准的一部分。(截至2020年3月5日)

不过,这是我们很快就会看到的更改,因此您应该能够使用 s 取消请求。AbortControllerAbortSignal

长版

如何:

它的工作方式是这样的:

步骤1:你创建一个(现在我刚刚用了这个AbortController)

const controller = new AbortController()

步骤2:你得到这样的s信号:AbortController

const signal = controller.signal

步骤3:您将要获取的传递如下:signal

fetch(urlToFetch, {
    method: 'get',
    signal: signal, // <------ This is our AbortSignal
})

第 4 步:只要您需要,请中止:

controller.abort();

以下是它如何工作的示例(适用于Firefox 57 +):

<script>
    // Create an instance.
    const controller = new AbortController()
    const signal = controller.signal

    /*
    // Register a listenr.
    signal.addEventListener("abort", () => {
        console.log("aborted!")
    })
    */


    function beginFetching() {
        console.log('Now fetching');
        var urlToFetch = "https://httpbin.org/delay/3";

        fetch(urlToFetch, {
                method: 'get',
                signal: signal,
            })
            .then(function(response) {
                console.log(`Fetch complete. (Not aborted)`);
            }).catch(function(err) {
                console.error(` Err: ${err}`);
            });
    }


    function abortFetching() {
        console.log('Now aborting');
        // Abort.
        controller.abort()
    }

</script>



<h1>Example of fetch abort</h1>
<hr>
<button onclick="beginFetching();">
    Begin
</button>
<button onclick="abortFetching();">
    Abort
</button>

来源:


答案 2

https://developers.google.com/web/updates/2017/09/abortable-fetch

https://dom.spec.whatwg.org/#aborting-ongoing-activities

// setup AbortController
const controller = new AbortController();
// signal to pass to fetch
const signal = controller.signal;

// fetch as usual
fetch(url, { signal }).then(response => {
  ...
}).catch(e => {
  // catch the abort if you like
  if (e.name === 'AbortError') {
    ...
  }
});

// when you want to abort
controller.abort();

适用于边缘16(2017-10-17),firefox 57(2017-11-14),桌面野生动物园11.1(2018-03-29),ios野生动物园11.4(2018-03-29),chrome 67(2018-05-29)等。


在较旧的浏览器上,您可以使用github的whatwg-fetch polyfillAbortController polyfill。您可以检测较旧的浏览器,并有条件地使用polyfills

import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'
import {fetch} from 'whatwg-fetch'

// use native browser implementation if it supports aborting
const abortableFetch = ('signal' in new Request('')) ? window.fetch : fetch