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 相关文章推荐
键盘控制事件应用教程大全
Nov 24 Javascript
使用正则替换变量
May 05 Javascript
JavaScript 解析读取XML文档 实例代码
Jul 07 Javascript
JS控制图片等比例缩放的示例代码
Dec 24 Javascript
JavaScript对象之深度克隆介绍
Dec 08 Javascript
JS中Eval解析JSON字符串的一个小问题
Feb 21 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
Aug 17 Javascript
AngularJS入门教程之XHR和依赖注入详解
Aug 18 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
vue注册组件的几种方式总结
Mar 08 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 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实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
JQuery基础语法小结
2015/02/27 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
详解vue添加删除元素的方法
2018/06/30 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
python去除扩展名的实例讲解
2018/04/23 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
Python assert关键字原理及实例解析
2019/12/13 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
自我管理的活动方案
2014/08/25 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
入学证明
2015/06/23 职场文书
安全教育培训制度
2015/08/06 职场文书
体育委员竞选稿
2015/11/21 职场文书
情况说明书格式及范文
2019/06/24 职场文书
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
python内置模块之上下文管理contextlib
2022/06/14 Python