vue axios重复点击取消上一次请求封装的方法
使用场景
重复点击或者多tab标签使用一个视图等(当然也可以用加载中或者透明背景禁止请求中再次点击)
封装代码
来自于互联网
letpending=[];//声明一个数组用于存储每个请求的取消函数和axios标识 letcancelToken=axios.CancelToken; letremovePending=(config)=>{ for(letpinpending){ if(pending[p].u===config.url+'&'+config.method){//当当前请求在数组中存在时执行函数体 pending[p].f();//执行取消操作 pending.splice(p,1); } } } //http请求拦截器 axios.interceptors.request.use(config=>{ removePending(config);//在一个axios发送前执行一下取消操作 config.cancelToken=newcancelToken((c)=>{ //这里的axios标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式 pending.push({u:config.url+'&'+config.method,f:c}); }); returnPromise.resolve(config) },error=>{ returnPromise.reject(error) }) //http响应拦截器 axios.interceptors.response.use(data=>{ removePending(data.config);//在一个axios响应后再执行一下取消操作,把已经完成的请求从pending中移除 returnPromise.resolve(data) },error=>{ //加载失败 return{'data':{}} //returnPromise.reject(error) })
经过多次测试发现不同请求也给我取消了,原因是没有校验请求参数,也就是说get请求可以用,修改以下代码
pending.push({u:config.url+'&'+config.method,f:c});
修改为:
pending.push({u:config.url+JSON.stringify(config.data)+'&'+config.method,f:c});//config.data为请求参数
上面判断也需要修改,这样get请求和post都可以用了
解决分析
(个人理解)
官方提供了axios.CancelToken来取消上一次请求方法,因此只需要判断上一次请求是否重复。声明数组变量pending用于存储每个请求实例的axios标识(请求方式,请求参数,请求url)和该实例的取消函数;在请求拦截器中创建取消函数实例,将请求的标识(判断重复标识)及该请求实例取消函数push到pending数组中,创建取消上一次请求方法removePending,该方法主要判断axios请求标识是否重复,重复则执行该实例的取消函数,并且从pending中移除标识及该实例取消函数。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。