如何取消 HTTP fetch() 请求?断续器:长版
有一个新的API用于从JavaScript发出请求:fetch()
。是否有任何内置机制可以在运行中取消这些请求?
有一个新的API用于从JavaScript发出请求:fetch()
。是否有任何内置机制可以在运行中取消这些请求?
fetch
现在支持截至2017年9月20日的参数,但目前并非所有浏览器都支持此功能。signal
2020年更新:大多数主流浏览器(Edge,Firefox,Chrome,Safari,Opera和其他一些浏览器)都支持该功能,这已成为DOM生活标准的一部分。(截至2020年3月5日)
不过,这是我们很快就会看到的更改,因此您应该能够使用 s 取消请求。AbortController
AbortSignal
它的工作方式是这样的:
步骤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>
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 polyfill和AbortController 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