axios请求会pending几秒再返回数据是什么原因?

前言

最近一个后台项目(使用的是Vue+axios)上遇到了一个很奇怪的问题。
在post请求的时候,会pending几秒再返回数据。

在这里插入图片描述

问题案例

最后发现是浏览器请求阻塞原因,下图其中一个请求阻塞了1.6s。

在这里插入图片描述

总结

造成pending等待原因是: 因为同一个页面请求太多,但是浏览器同时能发送的请求数量有限,所以该请求被放在队列里等待了。上面截图有个queued at 1.6秒,也就是该请求从代码执行到真正发送等了近2s时间。

解决方案:

  • 减少请求数量

  • 优化接口反应速度

  • 合并请求等

### 使用 Axios 拦截并防止重复请求 为了拦截并阻止重复请求,在创建 Axios 实例时可以设置自定义的拦截逻辑。通过维护一个活动请求集合来跟踪正在进行中的请求,当新请求到来时先检查该集合是否存在相同的请求。如果存在,则取消新的请求;反之则将其加入到集合中。 ```javascript const pendingRequests = new Map(); // 添加唯一标识符作为key用于存储pending状态下的请求 function generateRequestId(config) { return [config.method, config.url, JSON.stringify(config.params), JSON.stringify(config.data)].join('&'); } axios.interceptors.request.use((config) => { const requestId = generateRequestId(config); if (pendingRequests.has(requestId)) { // 存在相同请求返回Promise.reject表示拒绝此次请求 return Promise.reject(new Error('Duplicate request detected')); } else { // 将当前请求存入Map对象 pendingRequests.set(requestId, true); // 请求成功发送后清除记录 config.__cancelToken__ = axios.CancelToken.source(); config.cancelToken = config.__cancelToken__.token; return config; } }, error => Promise.reject(error)); axios.interceptors.response.use(response => { const requestId = generateRequestId(response.config); // 清理已完成的请求 pendingRequests.delete(requestId); return response; }, error => { const { config } = error; if (config && !error.response) { // 取消请求的情况处理 if (!axios.isCancel(error)) { const requestId = generateRequestId(config); // 若请求被取消也应清理对应的标记 pendingRequests.delete(requestId); } } return Promise.reject(error); }); ``` 此代码片段展示了如何利用 `axios` 的请求和响应拦截器功能[^1] 来实现对重复提交请求的有效控制,并且提供了相应的错误处理机制以确保程序健壮性。每当有新的 HTTP 请求发出之前都会经过这个过滤过程,从而避免不必要的资源浪费以及可能引发的数据一致性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值