axios 如何取消请求

文章介绍了如何使用Axios库中的AbortController和CancelToken来取消HTTP请求。AbortController是从v0.22.0版本开始支持的新方法,而CancelToken则是之前版本中用于取消请求的方式,但已在新项目中被弃用。用户可以通过这些机制在需要时中断请求,例如在操作取消或有新的数据需求时。
摘要由CSDN通过智能技术生成

axios 取消请求的方法:

1.AbortController

v0.22.0 开始,Axios 支持以 fetch API 方式—— AbortController 取消请求:

const controller = new AbortController();

axios.get('/foo/bar', {
   signal: controller.signal
}).then(function(response) {
   //...
});
// 取消请求
controller.abort()

2.CancelToken(已废弃)

还可以使用 cancel token 取消一个请求,Axios 的 cancel token API 是基于被撤销 cancelable promises proposal。(此 API 从 v0.22.0 开始已被弃用,不应在新项目中使用)

使用方式:
可以使用 CancelToken.source 工厂方法创建一个 cancel token ,如下所示:

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

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // 处理错误
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

也可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建一个 cancel token:

const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
});

// 取消请求
cancel();

3.在过渡期间,可以使用这两种取消 API,即使是针对同一个请求,并可以使用同一个 cancel token 或 signal 取消多个请求:

const controller = new AbortController();

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

axios.get('/user/12345', {
  cancelToken: source.token,
  signal: controller.signal
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // 处理错误
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消请求 (message 参数是可选的)
source.cancel('Operation canceled by the user.');
// 或
controller.abort(); // 不支持 message 参数

axios官网
【实战】Axios取消请求 - CancelToken

封装 Axios 取消请求通常是为了提高 JavaScript 应用程序中 HTTP 请求的管理效率,特别是当你需要处理长时间运行的操作或者在用户取消操作时停止请求时。下面是一个简单的例子,展示了如何在 TypeScript 中使用 Axios 实现这个功能: ```typescript import axios from 'axios'; // 创建一个带取消请求功能的 Axios 实例 class CancelableAxios { private axiosInstance: AxiosInstance; private cancelTokenSource?: CancelTokenSource; constructor() { this.axiosInstance = axios.create(); } // 发起请求,并返回一个可以用于取消请求的 token async request(url: string): Promise<{ data: any; cancel: () => void }> { const cancelTokenSource = axios.CancelToken.source(); this.cancelTokenSource = cancelTokenSource; try { return await this.axiosInstance({ url, method: 'GET', cancelToken: cancelTokenSource.token, }); } catch (error) { if (axios.isCancel(error)) { console.log('Request canceled by the user'); } throw error; } } // 取消请求 cancel(): void { if (this.cancelTokenSource) { this.cancelTokenSource.cancel(); this.cancelTokenSource = undefined; } } } const axiosWithCancel = new CancelableAxios(); // 使用示例 async function fetchData() { const { data, cancel } = await axiosWithCancel.request('https://api.example.com/data'); // 用户点击取消按钮时 if (buttonWasClickedToCancel) { cancel(); } console.log(data); } fetchData(); ``` 在这个封装中,我们创建了一个 `CancelableAxios` 类,它有一个内部的 `cancelTokenSource`,并在每次请求时返回一个新的取消令牌。如果用户需要取消请求,只需要调用 `cancel()` 方法即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值