【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中删除
}
)

效果

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

相关推荐
拜晨21 小时前
用流式 JSON 解析让 AI 产品交互提前
前端·javascript
浩男孩21 小时前
🍀vue3 + Typescript +Tdesign + HiPrint 打印下载解决方案
前端
andwhataboutit?21 小时前
LANGGRAPH
java·服务器·前端
无限大621 小时前
为什么"Web3"是下一代互联网?——从中心化到去中心化的转变
前端·后端·程序员
cypking21 小时前
CSS 常用特效汇总
前端·css
程序媛小鱼21 小时前
openlayers撤销与恢复
前端·js
Thomas游戏开发21 小时前
如何基于全免费素材,0美术成本开发游戏
前端·后端·架构
若梦plus21 小时前
Hybrid之JSBridge原理
前端·webview
chilavert31821 小时前
技术演进中的开发沉思-269 Ajax:拖放功能
前端·javascript·ajax
xiaoxue..21 小时前
单向数据流不迷路:用 Todos 项目吃透 React 通信机制
前端·react.js·面试·前端框架