返回

Abort XHR/Fetch 请求的优雅方法

前端

在现代 Web 开发中,异步请求已成为不可或缺的一部分,XHR 和 Fetch 是两种最常用的技术。然而,在某些情况下,我们可能需要取消正在进行的请求,例如用户在提交表单之前改变了主意,或者我们收到服务器的响应后不再需要其他请求的结果。

  1. XHR 请求的 abort() 方法

对于 XHR 请求,我们可以使用 abort() 方法来取消请求。该方法会立即中止请求,并引发 abort 事件。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api/data');
xhr.send();

// 在需要取消请求时调用
xhr.abort();
  1. Fetch 请求的 abort() 方法

Fetch 请求也提供了 abort() 方法来取消请求。该方法同样会立即中止请求,但不会引发任何事件。

const request = fetch('https://example.com/api/data');

// 在需要取消请求时调用
request.abort();
  1. 设置请求超时时间

我们可以通过设置请求超时时间来间接地取消请求。如果请求在指定的时间内没有收到响应,浏览器会自动中止请求。

const xhr = new XMLHttpRequest();
xhr.timeout = 5000; // 5 秒超时时间
xhr.open('GET', 'https://example.com/api/data');
xhr.send();
  1. 使用信号量(Signal)取消请求

ES2017 引入了信号量(Signal)的概念,它可以用来取消异步操作,包括 XHR 和 Fetch 请求。

const controller = new AbortController();
const signal = controller.signal;

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api/data');
xhr.signal = signal;
xhr.send();

// 在需要取消请求时调用
controller.abort();
  1. 使用 Axios 库取消请求

Axios 是一个流行的 JavaScript 库,它可以简化 HTTP 请求的处理。Axios 提供了内置的取消功能,我们可以使用它来轻松取消请求。

const axios = require('axios');

const cancelToken = axios.CancelToken;
const source = cancelToken.source();

axios.get('https://example.com/api/data', {
  cancelToken: source.token
});

// 在需要取消请求时调用
source.cancel('Request canceled');

除了上述方法外,我们还可以通过修改请求头来取消请求。例如,我们可以设置 X-Requested-With: XMLHttpRequest 头,然后使用 XMLHttpRequest.abort() 方法来取消请求。

在使用这些方法时,我们应该考虑以下几点:

  • 确保在请求被取消后释放资源,例如关闭连接、释放内存等。
  • 在使用信号量时,注意信号量是不可变的,一旦信号量被中止,就不能再被使用。
  • 在使用 Axios 库时,注意取消请求后,Axios 不会自动释放资源,我们需要手动释放。

通过对这些方法的全面了解和灵活应用,我们可以优雅地处理 XHR 和 Fetch 请求的取消,确保我们的应用程序更加健壮和可靠。