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实现手把手教你月入万刀(转贴)
Nov 07 Javascript
通过javascript设置css属性的代码
Dec 28 Javascript
JavaScript学习笔记(十)
Jan 17 Javascript
jQuery控制网页打印指定区域的方法
Apr 07 Javascript
JavaScript实现快速排序的方法
Jul 31 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
Sep 17 Javascript
微信小程序 小程序制作及动画(animation样式)详解
Jan 06 Javascript
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
代码详解JS操作剪贴板
Feb 11 Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 Javascript
vuex存取值和映射函数使用说明
Jul 24 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
PHP编程函数安全篇
2013/01/08 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
好家长事迹材料
2014/01/23 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
婚内房产协议书范本
2014/10/02 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书