news 2026/4/16 16:16:26

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/15 22:58:22

专业级拼多多数据采集方案:基于Scrapy框架的实战指南

专业级拼多多数据采集方案:基于Scrapy框架的实战指南 【免费下载链接】scrapy-pinduoduo 拼多多爬虫,抓取拼多多热销商品信息和评论 项目地址: https://gitcode.com/gh_mirrors/sc/scrapy-pinduoduo 在电商数据分析和市场研究领域,拼多…

作者头像 李华
网站建设 2026/4/16 12:42:36

城通网盘直连解析工具深度评测:能否真正突破传输瓶颈?

城通网盘直连解析工具深度评测:能否真正突破传输瓶颈? 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 作为网盘重度用户,你是否曾因城通网盘那令人窒息的下载速度而放…

作者头像 李华
网站建设 2026/4/16 15:10:27

WarcraftHelper完整使用指南:彻底优化魔兽争霸III游戏体验

WarcraftHelper完整使用指南:彻底优化魔兽争霸III游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽争…

作者头像 李华
网站建设 2026/4/16 12:16:18

M9A自动化助手终极指南:彻底解放《重返未来:1999》日常操作

M9A自动化助手终极指南:彻底解放《重返未来:1999》日常操作 【免费下载链接】M9A 重返未来:1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9a/M9A 你是否每天花费大量时间重复登录游戏、手动刷副本,却感觉游戏乐…

作者头像 李华
网站建设 2026/4/16 12:57:00

跨平台词库转换终极指南:轻松迁移20+输入法词库

跨平台词库转换终极指南:轻松迁移20输入法词库 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为不同输入法间的词库不兼容而烦恼吗?每次…

作者头像 李华
网站建设 2026/4/16 14:27:06

MAA智能助手:重新定义你的明日方舟游戏体验

MAA智能助手:重新定义你的明日方舟游戏体验 【免费下载链接】MaaAssistantArknights 一款明日方舟游戏小助手 项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights 你是否曾因重复的基建管理而感到疲惫?是否在深夜还要强打精…

作者头像 李华