news 2026/4/25 6:12:15

Vue——网络请求与数据交互篇【请求防抖与重复提交防护】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue——网络请求与数据交互篇【请求防抖与重复提交防护】

背景问题:
需要防止重复提交请求。

方案思考:
实现请求防抖和重复提交防护。

具体实现:
请求防抖和重复提交防护:

// utils/request-guard.jsimport{ElMessage}from'element-plus'// 请求防抖和重复提交防护classRequestGuard{constructor(){// 存储待处理的请求this.pendingRequests=newMap()// 存储请求的唯一标识this.requestKeys=newMap()}// 生成请求唯一标识generateRequestKey(config){const{method,url,params,data}=configreturn`${method}-${url}-${JSON.stringify(params)}-${JSON.stringify(data)}`}// 检查请求是否正在处理中hasPendingRequest(config){constkey=this.generateRequestKey(config)returnthis.pendingRequests.has(key)}// 添加待处理请求addPendingRequest(config){constkey=this.generateRequestKey(config)this.pendingRequests.set(key,config)}// 移除待处理请求removePendingRequest(config){constkey=this.generateRequestKey(config)this.pendingRequests.delete(key)}// 取消所有待处理请求cancelAllPendingRequests(){this.pendingRequests.forEach((config,key)=>{if(config.cancelToken){config.cancelToken.cancel(`Request${key}canceled`)}})this.pendingRequests.clear()}}exportconstrequestGuard=newRequestGuard()// 防抖函数exportfunctiondebounce(func,delay){lettimeoutIdreturnfunction(...args){clearTimeout(timeoutId)timeoutId=setTimeout(()=>func.apply(this,args),delay)}}// 节流函数exportfunctionthrottle(func,limit){letinThrottlereturnfunction(){if(!inThrottle){func.apply(this,arguments)inThrottle=truesetTimeout(()=>inThrottle=false,limit)}}}

更新请求工具以集成防护机制:

// utils/request.js (更新版本)importaxiosfrom'axios'import{ElMessage,ElNotification}from'element-plus'import{useUserStore}from'@/stores/modules/user'import{requestGuard}from'./request-guard'// 创建 axios 实例constservice=axios.create({baseURL:import.meta.env.VITE_APP_BASE_API||'/api',timeout:15000,headers:{'Content-Type':'application/json;charset=UTF-8'}})// 请求拦截器service.interceptors.request.use(config=>{// 防止重复请求if(requestGuard.hasPendingRequest(config)){constsource=axios.CancelToken.source()config.cancelToken=source.token source.cancel('重复请求')returnPromise.reject(newaxios.Cancel('重复请求'))}// 添加待处理请求requestGuard.addPendingRequest(config)// 添加认证 tokenconsttoken=localStorage.getItem('access_token')if(token){config.headers['Authorization']=`Bearer${token}`}// 添加请求时间戳if(config.method==='get'){config.params={...config.params,_t:Date.now()}}returnconfig},error=>{returnPromise.reject(error)})// 响应拦截器service.interceptors.response.use(response=>{// 移除待处理请求requestGuard.removePendingRequest(response.config)constres=response.dataif(res.code&&res.code!==200){ElMessage.error(res.message||'请求失败')if(res.code===401){constuserStore=useUserStore()userStore.clearUser()window.location.href='/login'}returnPromise.reject(newError(res.message||'Error'))}else{returnres}},error=>{// 移除待处理请求if(error.config){requestGuard.removePendingRequest(error.config)}if(axios.isCancel(error)){console.log('请求被取消:',error.message)returnPromise.reject(error)}letmessage='请求失败'if(error.response){conststatus=error.response.statusswitch(status){case400:message='请求参数错误'breakcase401:message='未授权,请重新登录'constuserStore=useUserStore()userStore.clearUser()window.location.href='/login'breakcase403:message='拒绝访问'breakcase404:message='请求资源不存在'breakcase500:message='服务器内部错误'breakdefault:message=`连接错误${status}`}}elseif(error.request){message='网络连接异常'}else{message=error.message}ElMessage.error(message)returnPromise.reject(error)})exportdefaultservice
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 23:24:45

STM32嵌入式开发实战宝典:一站式解决方案助力项目快速落地

STM32嵌入式开发实战宝典:一站式解决方案助力项目快速落地 【免费下载链接】stm32 STM32 stuff 项目地址: https://gitcode.com/gh_mirrors/st/stm32 STM32嵌入式开发项目为开发者提供了一个完整的驱动生态体系,从基础外设到复杂应用,…

作者头像 李华
网站建设 2026/4/20 15:14:36

ncmToMp3:解锁网易云加密音乐的全能秘籍

ncmToMp3:解锁网易云加密音乐的全能秘籍 【免费下载链接】ncmToMp3 网易云vip的ncm文件转mp3/flac - ncm file to mp3 or flac 项目地址: https://gitcode.com/gh_mirrors/nc/ncmToMp3 你是否曾经为下载的网易云音乐只能在特定App中播放而烦恼?那…

作者头像 李华
网站建设 2026/4/21 19:53:46

vectorizer图像矢量化完整指南:5分钟学会PNG转SVG核心技术

vectorizer图像矢量化完整指南:5分钟学会PNG转SVG核心技术 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer 想要将普通PNG、JPG图片…

作者头像 李华
网站建设 2026/4/24 2:30:27

魔兽争霸3帧率革命:从60帧到180帧的终极优化手册

魔兽争霸3帧率革命:从60帧到180帧的终极优化手册 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3的卡顿问题困扰吗&#x…

作者头像 李华
网站建设 2026/4/24 11:34:57

大众点评数据采集实战指南:突破动态字体加密的完整解决方案

大众点评数据采集实战指南:突破动态字体加密的完整解决方案 【免费下载链接】dianping_spider 大众点评爬虫(全站可爬,解决动态字体加密,非OCR)。持续更新 项目地址: https://gitcode.com/gh_mirrors/di/dianping_sp…

作者头像 李华
网站建设 2026/4/22 8:20:00

OneDragon智能托管系统:重新定义绝区零游戏体验

OneDragon智能托管系统:重新定义绝区零游戏体验 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 在数字娱乐快速…

作者头像 李华