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 相关文章推荐
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
Aug 08 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
JavaScript将数字转换成大写中文的方法
Mar 23 Javascript
Angular.JS读取数据库数据调用完整实例
Jul 02 Javascript
js图片无缝滚动插件使用详解
May 26 Javascript
js实现简单放大镜效果
Mar 07 Javascript
RxJS在TypeScript中的简单使用详解
Apr 13 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 Javascript
js仿淘宝放大镜效果
Dec 28 Javascript
JavaScript this关键字的深入详解
Jan 14 Javascript
Vue通过懒加载提升页面响应速度
May 10 Vue.js
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.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
jquery maxlength使用说明
2011/09/09 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
Python随机函数random()使用方法小结
2018/04/29 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
大学生自荐书范文
2013/12/10 职场文书
入党转预备思想汇报
2014/01/07 职场文书
高一新生军训方案
2014/05/12 职场文书
2014年施工员工作总结
2014/11/18 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
关于运动会的广播稿
2015/08/19 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
分家协议书范本
2016/03/22 职场文书
学习计划是什么
2019/04/30 职场文书
Redis实现订单过期删除的方法步骤
2022/06/05 Redis