【JS】Axios取消未完成请求解决Tab频繁切换数据问题

一、场景描述 

 Tab切换频率较低、数据返回速度理想的情况下,几乎不用考虑这个问题。切换频率高如果不处理未完成的请求不仅会严重影响页面性能,由于浏览器并发请求限制,也可能会造成后续请求超时。另外一个较为直观的业务影响是,频繁切换也会造成数据渲染错误,如下图:当前已切换到待付款,但是渲染的数据是前面请求的已完成的数据。

二、解决方案原理:

 利用 Javascript XMLHttpRequest 对象上的 abort 方法,终止已发出的请求。MDN上关于此方法的解释:当一个请求被终止,它的  readyState 将被置为 XMLHttpRequest.UNSENT (0),并且请求的 status 置为 0。

而我们业务里的场景,需要在发出请求时,收集请求集合,存储一个cancel函数。然后在请求前遍历这个集合并调用cancel函数,取消在此之前的所有请求。

三、axios CancelToken用法

那么在axios中怎么中止http请求?先上axios官方文档的用法。Tips:可以使用同一个 cancel token 取消多个请求。

可以使用 CancelToken.source 工厂方法创建 cancel

### Vue3 中使用 Axios 在路由切换取消未完成请求 在 Vue3 的开发过程中,当用户快速切换页面可能会遇到多个并发请求问题。如果这些请求中的某些尚未完成,则可能导致不必要的资源消耗或者数据冲突。为了应对这种情况,在 Axios 提供的功能基础上,可以利用 `CancelToken` 来实现对未完成请求的管理。 以下是具体实现方式: #### 使用 CancelToken 取消请求 Axios 支持通过 `CancelToken` 实现请求取消功能。可以在每次发送新请求之前先取消之前的请求实例[^1]。下面是一个完整的解决方案示例: ```javascript import axios from 'axios'; import { onBeforeUnmount, ref } from 'vue'; import { useRoute, useRouter } from 'vue-router'; export default { setup() { const source = axios.CancelToken.source(); const isCancelled = ref(false); const fetchData = async () => { try { const response = await axios.get('/api/data', { cancelToken: source.token, }); if (!isCancelled.value) { console.log(response.data); } } catch (error) { if (axios.isCancel(error)) { console.warn('Request canceled:', error.message); } else { throw error; } } }; const route = useRoute(); const router = useRouter(); // 当前路由变化触发 router.beforeEach((to, from) => { if (source) { source.cancel('Operation canceled due to navigation.'); isCancelled.value = true; // 设置标志位防止旧数据被处理 } return true; }); onBeforeUnmount(() => { if (source) { source.cancel('Component unmounted'); } }); fetchData(); // 初始加载数据 return {}; }, }; ``` 在这个例子中,我们创建了一个全局可用的 `CancelToken` 对象,并将其绑定到每个请求上。每当检测到路由发生变化或组件卸载,都会调用 `cancel()` 方法来终止正在进行的操作并释放内存占用[^1]。 另外需要注意的是,对于 Promise 链条来说,一旦某个中间环节抛出了异常(比如这里手动引发的取消事件),整个链条就会进入 rejected 状态而不会继续执行后续逻辑[^2]。因此我们在捕获错误之后还需要额外判断是否是因为主动取消引起的特殊情形以便做出适当反应。 最后提醒一点,虽然上面演示了如何基于 Vue Router 进行动态监听从而达到目的,但在实际项目里可能还会涉及到更多复杂场景下的需求调整——例如区分不同类型的 API 调用分别设置独立控制机制等等。 #### 总结 综上所述,借助于 Axios 自带的 `CancelToken` 功能以及 Vue Composition API 和 Vue Router 的配合,能够有效解决频繁跳转造成的遗留挂起请求问题,提升应用性能表现的同也增强了用户体验流畅度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值