【VUE】如何有效管理重复请求

【VUE】如何管理重复请求

需求

重复的HTTP请求可能对应用程序性能造成很大影响,尤其是在用户快速点击或多次触发同一操作时。在Vue应用中,我们可以使用axios的请求拦截器(interceptors)配合AbortController来取消重复的HTTP请求

实现思路

通过使用axios的拦截器和AbortController API追踪并取消重复的HTTP请求,为每个请求生成唯一标识符,并在发现重复请求时使用AbortController的abort方法取消之前的请求,从而优化了网络性能并提升了用户体验。

代码实现

先创建一个文件来储存需要管理的API地址

requistDuplicateBlacklist.js

javascript 复制代码
export default [
    '/test/list&post',
    '/test/list&get',
    '/test/watch/.*&get'
]

使用&符号分割了请求地址与请求方式;当地址上有动态变化的部分时用.*代替,方便稍后的正则匹配;

然后我们封装一下axios

axios.js

javascript 复制代码
import axios from 'axios';
import requistDuplicateBlacklist from './requistDuplicateBlacklist'
//初始化window.cancelTokenSources变量
if(!window.cancelTokenSources){
  window.cancelTokenSources={}
}
// request拦截器
service.interceptors.request.use(
(config) => {
    let key = config.url+'&'+config.method;
    for(let item of requistDuplicateBlacklist){
      const regex = new RegExp('^' + item + '$');
      const isMatch = regex.test(key);
      if(isMatch){
        if(window.cancelTokenSources[key]){
          //如果之前有未完成请求,先中断
          window.cancelTokenSources[key].abort()
        }
        let controller = new AbortController();
        window.cancelTokenSources[key] = controller;//将要管理的请求储存在window.cancelTokenSources内
        config.signal = controller.signal
        break;
      }
    }
    ...
)
// 响应拦截器
service.interceptors.response.use(
(res) => {
let key = res.config.url+'&'+res.config.method;
    delete window.cancelTokenSources[key];//请求结束,从window.cancelTokenSources中删除
}
)

效果

如图,当存在重复请求时,上一个请求将会被取消,只保留最后一次请求。

相关推荐
学前端的小朱12 分钟前
修改输出资源的名称和路径、自动清空上次打包资源
前端·webpack·打包工具
涔溪21 分钟前
如何在Express.js中定义多个HTTP方法?
javascript·http·express
嘤嘤怪呆呆狗23 分钟前
【开发问题记录】执行 git cz 报require() of ES Module…… 错误
前端·javascript·vue.js·git·vue
夜斗(dou)1 小时前
谷歌开发者工具 - 网络篇
前端·网络·chrome devtools
常常不爱学习1 小时前
CSS盒子模型(溢出隐藏,块级元素和行级元素的居中对齐,元素样式重置)
前端·css
风抽过的烟头1 小时前
Python提取字符串中的json,时间,特定字符
前端·python·json
SomeB1oody2 小时前
【Rust自学】6.3. 控制流运算符-match
开发语言·前端·rust
夕水2 小时前
你可能需要避免的5个react的ref错误用法
javascript·react.js
m0_748256782 小时前
【Django自学】Django入门:如何使用django开发一个web项目(非常详细)
前端·django·sqlite
林小白的日常2 小时前
uniapp中wx.getFuzzyLocation报错如何解决
前端·javascript·uni-app