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 相关文章推荐
[IE&FireFox兼容]JS对select操作
Jan 07 Javascript
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
Feb 09 Javascript
js apply/call/caller/callee/bind使用方法与区别分析
Oct 28 Javascript
javascript学习笔记(五) Array 数组类型介绍
Jun 19 Javascript
jquery中的事件处理详细介绍
Jun 24 Javascript
node.js中的console.log方法使用说明
Dec 09 Javascript
JavaScript对象学习小结
Sep 02 Javascript
Jquery获取当前城市的天气信息
Aug 05 Javascript
jQuery窗口拖动功能的实现代码
Feb 04 Javascript
在Mac下彻底卸载node和npm的方法
May 16 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
Aug 24 Javascript
重置Redux的状态数据的方法实现
Nov 18 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中,文件上传
2006/12/06 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
可输入的下拉框
2006/06/19 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
2014/01/22 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
深入理解js中this的用法
2016/05/28 Javascript
jquery 属性选择器(匹配具有指定属性的元素)
2016/09/06 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
由浅入深讲解python中的yield与generator
2017/04/05 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Python numpy 常用函数总结
2017/12/07 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
10个Python小技巧你值得拥有
2018/09/29 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
django中url映射规则和服务端响应顺序的实现
2020/04/02 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
表扬通报怎么写
2015/01/16 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS