axios是如何做到取消请求的

博客探讨了在业务场景中如何使用axios实现请求取消功能,详细解释了axios的CancelToken.source()的工作过程,以及CancelToken如何通过Promise和XMLHttpRequest.abort()中断请求。通过创建CancelToken实例并传递给axios请求,当调用cancel方法时,请求会被中断并抛出异常。

业务具体场景需求

  1. 请求接口获取数据
  2. 显示 loading 遮罩防止用户后续请求
  3. loading 遮罩上要有一个取消按钮,防止接口时间过长影响用户体验
  4. 收到接口数据,关闭 loading 遮罩,跳转到下一个界面

axios 的逻辑实现(取消请求部分)

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

axios.get('/user/12345', {
  cancelToken: source.token
})
source.cancel();

axios 实现原理

关键字

  1. Promise
  2. XMLHttpRequest.abort()

具体原理概括及源码

axios.CancelToken.source() 发生了什么
  1. 创建了一个 CancelToken 实例给 token, CancelToken 的参数是一个函数,将函数参数再赋值给 cancel
  2. 将 { token: token,cancel: cancel } 作为新对象返回
CancelToken.source = function source() {
   
   
    var cancel;
    var token = new CancelToken(function executor(c) 
在 Vue 2 组件中使用 Axios 取消正在进行的请求,可以通过 Axios 提供的 `CancelToken` API 实现。首先需要从 Axios 导入 `CancelToken` 构造函数,并创建一个取消令牌。这个令牌可以在发起请求时作为配置项传入,从而允许通过调用与之关联的取消函数来中断请求。 例如,在组件内部定义一个方法用于发起 GET 请求,并绑定一个取消令牌到该请求上: ```javascript import axios from 'axios'; export default { data() { return { cancel: null, }; }, methods: { fetchData() { const CancelToken = axios.CancelToken; this.cancel = new CancelToken((c) => { // 将取消函数保存到组件实例上 this.cancelRequest = c; }); axios.get('http://example.com/data', { cancelToken: this.cancel, }) .then(response => { // 处理响应数据 }) .catch(thrown => { if (axios.isCancel(thrown)) { console.log('Request canceled', thrown.message); } else { // 处理错误情况 } }); }, cancelRequest() { // 检查是否存在待取消请求 if (this.cancelRequest) { this.cancelRequest('Operation canceled by the user.'); } }, }, }; ``` 在这个例子中,当 `fetchData` 方法被调用时,它会创建一个新的 `CancelToken` 并将其附加到请求配置中。同时,它还会把取消函数存储在一个组件的数据属性里。这样就可以在其他地方(如按钮点击事件)调用 `cancelRequest` 方法来取消请求[^3]。 需要注意的是,在实际开发过程中应该妥善管理取消函数的生命周期,确保不会导致内存泄漏。比如,在 Vue 组件销毁之前应当检查是否有未完成的请求并及时取消它们。此外,对于并发请求或者多个独立请求的情况,可能需要为每个请求分配不同的取消令牌以保证能够精确控制每一个请求取消操作[^5]。 为了更好地集成进 Vue 应用程序,还可以考虑将上述逻辑封装成一个可复用的服务或插件,以便于在整个应用中的各个组件间共享和使用。这样的做法有助于保持代码整洁,提高维护性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auspicious5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值