如何在 JavaScript 中取消请求

1,896 阅读2分钟

本文将向您展示如何取消 XMLHttpRequest、Fetch 和常用第三方库中的请求axios

在开始之前,有必要再次简要介绍一下 Ajax。它是异步 JavaScriptXML的缩写。这是 Jesse James Garrett 在 2005 年创造的一个术语,用于描述使用多种现有技术组合的“新”方法。所以它不是一个单独的技术。这种方法使 Web 应用程序能够对用户界面进行快速、增量更新,而无需重新加载整个浏览器页面。

XMLHttpRequestFetch 是目前浏览器提供的两个获取资源的 API。axios 是一个流行的三方 Promise 请求库,内部使用 XMLHttpRequest

取消 XMLHttpRequest 请求

XMLHttpRequest.abort()如果请求已经发送,该方法将中止请求。当一个请求被中止时,它readyState被更改为XMLHttpRequest.UNSENT(0) 并且请求的status代码被设置为 0。

例如:

const xhr = new XMLHttpRequest();
xhr.open('GET', ' http://127.0.0.1:3000/api/get' , true); 
xhr.send();
setTimeout(() => { 
 xhr.abort();
}, 1000);

下图是 Chrome DevTools 中 Network 中正常请求和取消请求的对比

取消fetch请求

如果要取消 Fetch 请求,则需要使用AbortController API。您可以使用构造函数创建一个新的 AbortController 对象。它有一个只读属性AbortController.signal,它是一个AbortSignal对象实例,可用于与 DOM 请求(例如 fetch 请求)进行通信或中止。

它还有一个方法AbortController.abort()可以中止获取请求、任何响应主体的消耗和流。

例如:

const controller = new AbortController();
void (async function () {
    const response = await fetch('http://127.0.0.1:3000/api/get', {
        signal: controller.signal,
    });
    const data = await response.json();
})();
setTimeout(() => {
    controller.abort();
}, 1000);

下面是一个对比:

请注意,controller.abort()支持传递可选参数reason。指示操作被中止的原因。在上面的例子中,我们没有指定它,那么它将被设置为 "AbortError" DOMException

而且我们也没有捕捉错误,然后你会在控制台中得到这样的错误。

![](files.mdnice.com/user/6362/0…

取消 Axios 请求

而在 Axios 中,因为v0.22.0它支持AbortControllerfetch API 方式取消请求:

const controller = new AbortController();
const API_URL = 'http://127.0.0.1:3000/api/get';
void (async function () {
    const response = await axios.get(API_URL, {
        signal: controller.signal,
    });
    const { data } = response;
})();
setTimeout(() => {
    controller.abort();
}, 1000);

下面是一个对比:

这是未捕获的错误:

虽然,axios 目前支持CancelToken取消请求的方法,但是已经被标记为 deprecated。更多信息请参见官方文档

我是南飞雁,你可以叫我飞雁,我是一名奋斗者,在实现财富自由的路上……

我喜欢分享,也喜欢思考;我有自己的人生规划和梦想;但有时也很迷茫……

我从事IT行业,研究的技术领域相对比较多而杂: PHP、MySQL、Linux、JavaScript、Node.js、NoSQL、PhotoShop、音视频处理、架构集群、网络通信、生活技巧、人生三观、做人做事读书……

我总是会在自己的公众号和掘金上写下自己的所思所想和近期要做的事,希望你关注我,我是一个奋斗者,我叫南飞雁