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 相关文章推荐
Ajax,UTF-8还是GB2312 eval 还是execScript
Nov 13 Javascript
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
jquery实现手机发送验证码的倒计时代码
Feb 12 Javascript
JS打开新窗口防止被浏览器阻止的方法
Jan 03 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
May 15 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
May 17 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
Angular整合zTree的示例代码
Jan 24 Javascript
如何使node也支持从url加载一个module详解
Jun 05 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
Feb 18 Javascript
详解vue修改elementUI的分页组件视图没更新问题
Nov 13 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
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
php树型类实例
2014/12/05 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
js jquery做的图片连续滚动代码
2008/01/06 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Python实现的建造者模式示例
2018/08/06 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
Python的条件锁与事件共享详解
2019/09/12 Python
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
关于Java finally的面试题
2016/04/27 面试题
女儿十岁生日答谢词
2014/01/27 职场文书
清扬洗发水广告词
2014/03/14 职场文书
庆元旦活动总结
2014/07/09 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
2015年党员自评材料
2014/12/17 职场文书
详解Redis主从复制实践
2021/05/19 Redis
python中24小时制转换为12小时制的方法
2021/06/18 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang