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 相关文章推荐
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
JavaScript中获取Radio被选中的值
Nov 11 Javascript
浅析javascript函数表达式
Feb 10 Javascript
AngularJS Ajax详解及示例代码
Aug 17 Javascript
Jquery组件easyUi实现选项卡切换示例
Aug 23 Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 Javascript
微信小程序三级联动地址选择器的实例代码
Jul 12 Javascript
Js中async/await的执行顺序详解
Sep 22 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
vue移动端弹框组件的实例
Sep 25 Javascript
vue项目使用微信公众号支付总结及遇到的坑
Oct 23 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 define()函数以及defined()函数的用法详解
2013/06/05 PHP
golang与PHP输出excel示例
2016/07/22 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
js中的string.format函数代码
2020/08/11 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
Python with的用法
2014/08/22 Python
Python解析xml中dom元素的方法
2015/03/12 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
成人继续教育实施方案
2014/03/01 职场文书
道路交通安全实施方案
2014/03/12 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
实习单位意见
2015/06/04 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js