更新:该方法已过时,新的代替方案是 AbortController ,并且!前端取消请求无法真实取消,原因在于请求发送到服务器后服务器或许已经做了处理,但是前端只是关闭了返回通道,可是实际上服务器已经对该请求做了处理,所以存在风险,不建议在post接口上使用,如需使用建议甩锅后端。

最近在看axios的时候发现一个之前用过的功能,但是一直没明白其中原理是什么,但是在仔细阅读了axios的api后结合之前所学,对当下的功能又有了新的理解,故又有了这篇文章。

axios,一个依基于promise的网络请求库。防抖的话这里就不复述了,不懂的可以自己网上查。

请求防抖的实现思路:定义一个数组用来放请求函数,每次在拦截器中判断是否有和数组中地址参数的请求,如果有就取消这个请求并返回。

核心api :axios.CancelToken;
axios的介绍是这样的:

You can also create a cancel token by passing an executor function to the constructor:CancelToken
您还可以通过向构造函数传递执行函数来创建一个取消令牌:CancelToken

简单来说就是用来取消axios的请求方法的。
使用方式:


const CancelToken = axios.CancelToken;
let cancel;axios.get('/user/12345', {cancelToken: new CancelToken(function executor(c) {// An executor function receives a cancel function as a parametercancel = c;})
});// cancel the requestcancel();

最后
全局请求防抖具体代码实现:

let cancelToken= axios.CancelToken;//取消api
let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let removePending = config => {pending.find((item,i)=>{//判断当前请求数组中是否存在相同请求地址的接口if(item.u===config.url + "&" + config.method){pending[i].c(); //执行取消方法pending.splice(i, 1); //把这条记录从数组中移除return true;}})
};//添加请求拦截器
axios.interceptors.request.use(config => {removePending(config); //在一个ajax发送前执行一下取消操作config.cancelToken = new cancelToken(c => {// 传入对比参数 和 取消方法pending.push({ u: config.url + "&" + config.method, c });});return config;},error => {return Promise.reject(error);}
);//添加响应拦截器
axios.interceptors.response.use(response => {//do something},error => {//因为请求被取消了,响应器中会走错误流程,这里返回一下自定义格式return {data: {code: 666,cancel: true,errorMsg: "请求已关闭"}};}
);

这边还有个优化思路就是在普通项目中还好,碰到带token或者特殊的类似无序参数的请求方法,或者项目特别大的,可能会导致我们的数组的内容长度会特别长,可以尝试在相应中完成请求后删除数组中对应的请求方法,这样的话,我们数组长度就不会越来越长了,但这在小项目中,接口请求不超过四位数,或者没有那种带无序请求参数的话都还是能用的。

依托 axios 实现全局请求防抖相关推荐

  1. Axios的Vue插件(添加全局请求/响应拦截器)

    /**  * @file Axios的Vue插件(添加全局请求/响应拦截器)  */ // https://github.com/mzabriskie/axios import axios from ...

  2. 同时多个axios请求_用 React+Antd 封装 Axios 实现全局 Loading 效果

    前言 今天在做 react 后台管理的时候要实现一个全局 Loading 效果,通常使用 axios 库与后端进行数据交互.为了更好的用户体验,在每次请求前添加一个加载效果,让用户知道在等待加载. 要 ...

  3. axios请求接口http_Vue使用Axios实现http请求以及解决跨域问题

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.Axios的中文文档以及github地址如下: 中文:https://www.kancloud.cn/y ...

  4. axios队列 vue_(十三 )Vue 封装axios(四种请求)及相关介绍

    Vue 封装axios(四种请求)及相关介绍 首先axios是基于promise的http库 promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执行,返回符合预期的 ...

  5. axios delete有请求体吗_封装 axios 取消重复请求

    编者按:本文作者舒丽琦,奇舞团前端开发工程师 在我们web开发过程中,很多地方需要我们取消重复的请求.但是哪种场合需要我们取消呢?我们如何取消呢?带着这些问题我们阅读本文. 阅读完本文,你将了解以下内 ...

  6. axios 最全 请求拦截器 响应拦截器 配置公共请求头 超时时间 以及get delete post put 四种请求传参方式

    axios 拦截器 请求拦截器 请求拦截器的作用是在请求发送前进行一些操作 例如在每个请求体里加上token,统一做了处理如果以后要改也非常容易 响应拦截器 响应拦截器的作用是在接收到响应后进行一些操 ...

  7. axios发送网络请求

    网络模块封装 选择什么网络模块 传统的Ajax 缺点:配置和调用方式等非常混乱 jQuery-Ajax 缺点:在Vue整个开发中都是不需要使用jQuery的 axios axios 功能特点: 在浏览 ...

  8. axios库读不到cookie_Vue axios 跨域请求无法带上cookie的解决

    Vue axios 跨域请求无法带上cookie的解决 在main.js设置 // 携带cookie axios.defaults.withCredentials = true 补充知识:VUE ax ...

  9. vue2.0 axios 登录post请求自动读取Set-Cookie设置

    因为axios在登录post请求的时候不会自动读取 Set-Cookie,如图下面的地方 先在在全局配置 axios.defaults.withCredentials = true 下载包 cnpm ...

最新文章

  1. 技术图文:浅析 C# Dictionary实现原理
  2. Cell Research封面 | 刘志华组揭示肠道菌群可促进胰岛素的分泌
  3. Python Train_机器学习--基于Python的简单线性回归
  4. “是福不是祸,是祸躲不过”这句话对吗?
  5. python教程:sum(1-2+3-4+...+99)
  6. Java提高学习之Object(3)
  7. Delphi中字符串比较大小 VS Oracle-SQL中字符串比较大小
  8. CF1368G Shifting Dominoes(扫描线求矩阵的并集)
  9. 【Java】使用Switch语句实现成绩等级判断
  10. 算法高级(6)-共识(Raft)算法
  11. 刷网课会被检测出来吗_目标检测中的Precision和Recall
  12. solrcloud 7.5在k8s上的部署安装和使用教程
  13. 2018年苏大计算机考研872真题及解析
  14. excel2013超链接进不去,提示“您的组织策略不允许...”
  15. r语言boxcox异方差_R教程-15:线性回归中的异方差
  16. 服务器维护必刷稀有宠物,完美国际2稀有宠物坐标及刷新时间(记得去抓)!!!...
  17. execute,executeQuery,executeUpdate三个方法有什么区别呢?
  18. Linux wifi wpa_sup,wifi详解(四)zz
  19. Found duplicate column(s) when inserting into hdfs://nameservice1/origin_data/events_7/data: `dt`;
  20. 绿色便携版杀毒软件Clamwin也能自动作业

热门文章

  1. CentOS安装rar、unrar解压缩软件的方法
  2. 新手学堂——JAVA从零开始教程(动画视频同步)
  3. 《华林科纳-半导体工艺》单晶硅清洗工艺
  4. 网卡ip地址突然变成169.254.xxx.xxx处理方法
  5. Unity下落式音游实现——(2)滑块移动及生成
  6. JavaWeb课设咖啡点单系统
  7. 《跟阿铭学Linux》作者李世明:谈不上告白,就是帮女友转型而已
  8. the bundle at bundle path is not signed using an apple submission certificate
  9. 十三五:深圳将打造智慧城市等十张名片
  10. HotSpot垃圾算法实现之记忆集与卡表和写屏障