vue axios重复点击取消上一次请求封装的方法


Posted in Javascript onJune 19, 2019

使用场景

重复点击或者多tab标签使用一个视图等(当然也可以用加载中或者透明背景禁止请求中再次点击)

封装代码

来自于互联网

let pending = []; //声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;
let removePending = (config) => {
 for(let p in pending){
  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 = new cancelToken((c)=>{
  // 这里的axios标识我是用请求地址&请求方式拼接的字符串,当然你可以选择其他的一些方式
  pending.push({ u: config.url + '&' + config.method, f: c }); 
 });
 
 return Promise.resolve(config)
}, error => {
 return Promise.reject(error)
})

// http响应拦截器
axios.interceptors.response.use(data => { 
 
 removePending(data.config); //在一个axios响应后再执行一下取消操作,把已经完成的请求从pending中移除
 
 return Promise.resolve(data)
 
}, error => {
 //加载失败
 return {'data':{}}
 // return Promise.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中移除标识及该实例取消函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
TextArea设置MaxLength属性最大输入值的js代码
Dec 21 Javascript
jquery 检测元素是否存在的实例代码
Nov 19 Javascript
javascript中HTMLDOM操作详解
Dec 11 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
Nov 29 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
Jun 27 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
Aug 19 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
vue项目中使用ueditor的实例讲解
Mar 05 Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 Javascript
Vue组件Draggable实现拖拽功能
Dec 01 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
Jul 24 Javascript
javascript创建元素和删除元素实例小结
Jun 19 #Javascript
Vue 2.0 侦听器 watch属性代码详解
Jun 19 #Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
Jun 19 #Javascript
js简单遍历获取对象中的属性值的方法示例
Jun 19 #Javascript
ionic4+angular7+cordova上传图片功能的实例代码
Jun 19 #Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
Jun 19 #Javascript
JavaScript箭头函数中的this详解
Jun 19 #Javascript
You might like
Zend的MVC机制使用分析(二)
2013/05/02 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
学习并汇集javascript匿名函数
2010/11/25 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
vue-router项目实战总结篇
2018/02/11 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python中使用PDB库调试程序
2015/04/05 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python中entry用法讲解
2020/12/04 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
人力资源部经理岗位职责规定
2014/02/23 职场文书
爱心捐款倡议书
2014/04/14 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
奖励通知
2015/04/22 职场文书
医院病假条怎么写
2015/08/17 职场文书
2016年公司新年寄语
2015/08/17 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android