news 2026/9/3 2:12:21

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/9/2 23:23:58

M9A终极助手:简单快速解放《重返未来:1999》双手的完整方案

M9A终极助手:简单快速解放《重返未来:1999》双手的完整方案 【免费下载链接】M9A 重返未来:1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9a/M9A 还在为《重返未来:1999》中重复性的日常任务而疲惫吗&#xff1…

作者头像 李华
网站建设 2026/9/3 0:19:11

语音转文字终极指南:Windows实时转录完整教程与实战技巧

语音转文字终极指南:Windows实时转录完整教程与实战技巧 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 还在为会议记录和音频整理而烦恼吗?TMSpeech作为一款创新的Windows实时语音转文字工具…

作者头像 李华
网站建设 2026/9/3 1:23:41

STM32嵌入式开发项目实践指南:构建完整硬件驱动生态

STM32嵌入式开发项目实践指南:构建完整硬件驱动生态 【免费下载链接】stm32 STM32 stuff 项目地址: https://gitcode.com/gh_mirrors/st/stm32 在嵌入式系统开发领域,STM32微控制器凭借其强大的性能和丰富的外设资源,已成为众多开发者…

作者头像 李华
网站建设 2026/9/2 23:30:08

GetQzonehistory:3分钟完成QQ空间历史数据永久备份的终极指南

GetQzonehistory:3分钟完成QQ空间历史数据永久备份的终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经翻看多年前的QQ空间说说,却发现有些内容…

作者头像 李华
网站建设 2026/9/3 0:07:32

Altium Designer仿真结合走线宽度与温升关系详解

走线越宽越好?别被“电流对照表”骗了!用Altium Designer真实仿真温升你有没有遇到过这样的情况:按照“pcb走线宽度与电流对照表”设计的电源走线,明明标称能扛2A,结果板子一上电,铜皮就开始发烫&#xff0…

作者头像 李华
网站建设 2026/9/3 0:21:52

Sunshine游戏串流完全指南:打造高性能个人云游戏平台

Sunshine游戏串流完全指南:打造高性能个人云游戏平台 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器,支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshin…

作者头像 李华