axios请求拦截器,也就是在请求发送之前执行自定义的函数。

axios源码版本 - ^0.27.2 (源码是精简版)

平时在业务中会这样去写请求拦截器,代码如下:

// 创建一个新的实例
var service = axios.create(); // 请求拦截器
service.interceptors.request.use((config) => {
// 请求头加token
config.headers['token'] = 'xxx';
... ... ... return config;
}, (err) => {
return Promise.reject(err);
});

其中 service.interceptors.request.use 方法起到了作用,其核心源码如下:

/* axios/core/Axios.js */
// Axios构造函数
function Axios(defaultConfig) {
this.defaults = defaultConfig;
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager()
}
} /* axios/core/InterceptorManager.js */
// InterceptorManager构造函数
function InterceptorManager() {
// 默认空数组
this.handlers= [];
} // InterceptorManager原型上定义use方法 (上述业务中的use方法,其实就是调用了该方法)
InterceptorManager.prototype.use = function(fulfilled, rejected) {
// 数组中push一个包含成功回调、失败回调的对象
this.handlers.push({
fulfilled: fulfilled,
rejected: rejected
}); // 返回数组长度 - 1
return this.handlers.length - 1;
} // InterceptorManager原型上定义eject方法
InterceptorManager.prototype.eject = function(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
} // InterceptorManager原型上定义forEach方法
InterceptorManager.prototype.forEach = function(fn) {
utils.forEach(this.handlers, function(h) {
if (h !== null) {
fn(h);
}
});
}

service.interceptors.request.use 原来就是向handlers数组push了一个对象,可打印信息查看,代码如下:

console.log(service.interceptors.request.handlers);
// 结果如下
[
{
fulfilled: (config) => {...},
rejedcted: (err) => {...}
}
]

那么,在发送请求时,请求拦截器是如何运作的,代码如下:

Axios.prototype.request = function(defaultConfigOrUrl, config) {
... ... ... var requestInterceptorChain = [];
this.interceptors.request.forEach(function (interceptor) {
// 将该实例的this.this.interceptors.request.handlers放入requestChain
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
}); var promise; // dispatchRequest就是请求过程
var chain = [dispatchRequest, undefined];
Array.prototype.unshift.apply(chain, requestInterceptorChain); promise = Promise.resolve(config);
while (chain.length) {
// 链式调用,不断减少chain数组的长度,直至为空
promise = promise.then(chain.shift(), chain.shift());
} return promise; ... ... ...
}

这也便是说为什么axios是基于promise的,请求拦截器 --> 请求 --> 响应拦截器。

取消拦截器

取消拦截器功能,作者觉得作用不大,代码如下:

var requestNumber = service.interceptors.request.use(fulfilled, rejected);

// 取消请求拦截器
service.interceptors.request.reject(requestNumber); service.post({})

多个请求拦截器

主要讲多个请求拦截器的执行顺序,代码如下:

// 第一个请求拦截器
service.interceptors.request.use(fulfilled1, rejected1); // 第二个请求拦截器
service.interceptors.request.use(fulfilled2, rejected2); // 第三个请求拦截器
service.interceptors.request.use(fulfilled3, rejected3); // 根据上述Axios.prototype.request方法,可以知道handlers数组:[fulfilled3, rejected3, fulfilled2, rejected2, fulfilled1, rejected1] // 所以执行顺序:fulfilled3 --> fulfilled2 --> fulfilled1

axios源码解析 - 请求拦截器的更多相关文章

  1. axios 源码解析(下) 拦截器的详解

    axios的除了初始化配置外,其它有用的应该就是拦截器了,拦截器分为请求拦截器和响应拦截器两种: 请求拦截器    ;在请求发送前进行一些操作,例如在每个请求体里加上token,统一做了处理如果以后要 ...

  2. Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

    ### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](htt ...

  3. Okhttp3源码解析(4)-拦截器与设计模式

    ### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](htt ...

  4. 源码解析Grpc拦截器(C#版本)

    前言 其实Grpc拦截器是我以前研究过,但是我看网上相关C#版本的源码解析相对少一点,所以笔者借这篇文章给大家分享下Grpc拦截器的实现,废话不多说,直接开讲(Grpc的源码看着很方便,包自动都能还原 ...

  5. axios源码解析 - 请求方法的别名实现

    axios中的创建请求方式很多,比如axios(url),axios.get(url),axios.post(url),axios.delete(url),方便快捷的api设计让axios火得一塌糊涂 ...

  6. springMVC源码分析之拦截器

    一个东西用久了,自然就会从仅使用的层面上升到探究其原理的层面,在javaweb中springmvc更是如此,越是优秀的框架,其底层实现代码更是复杂,而在我看来,一个优秀程序猿就相当于一名武林高手,不断 ...

  7. springMVC源码分析--HandlerInterceptor拦截器调用过程(二)

    在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...

  8. axios 源码解析(中) 代码结构

    axios现在最新的版本的是v0.19.0,本节我们来分析一下它的实现源码,首先通过 gitHub地址获取到它的源代码,地址:https://github.com/axios/axios/tree/v ...

  9. Struts 2.3.24源码解析+Struts2拦截参数,处理请求,返回到前台过程详析

    Struts2官网:http://struts.apache.org/ 目前最新版本:Struts 2.3.24 Struts1已经完全被淘汰了,而Struts2是借鉴了webwork的设计理念而设计 ...

随机推荐

  1. 在虚拟机里面安装wordpress

    第一步: 安装Mariadb数据库 使用下面代码安装 1 yum install mariadb-server.x86_64 设置开机启动和启动 1 systemctl start mariadb 2 ...

  2. ACL 权限控制机制 ?

    UGO(User/Group/Others) 目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式.是一种粗 粒度的文件系统权限控制模式. ACL(Access Control ...

  3. 在IE中设置在序列化没有版本号就提示

  4. 相对路径在IEAD中的位置

    相对路径在IEAD中的位置 工具栏-->Run -->Edit Configurations -->Working directory-->就是了 这里是直接到软件的地址:剩下 ...

  5. Canvas 核心技术

    最近项目需求中要写较多H5小游戏,游戏本身体量不是很复杂,主要是承载较多业务逻辑,所以决定用canvas来完成游戏部分.之前只是知道H5中有canvas这个东西,也知道它大概是画图的,但具体怎么用,还 ...

  6. 基 vue-element-admin升级的Vue3 +TS +Element-Plus 版本的后端管理前端解决方案 vue3-element-admin 正式对外发布,有来开源组织又一精心力作,毫无保留开放从0到1构建过程

    项目简介 vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 + Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youla ...

  7. window10解决需要管理员删除文件的权限问题

    1.快捷键:"win+R",输入:gpedit.msc  回车 2.依次点击:计算机配置-windows配置-安全设置-本地策略-安全选项 3.将两个管理员批准模式和管理员状态三者 ...

  8. jboss学习4-jboss7开发配置指南

    1      Jboss7下载与安装1.1     官方下载路径:http://www.jboss.org/jbossas/downloads,目前最新稳定版本为7.1.1 final,分别有zip和 ...

  9. java多线程的状态转换以及基本操作

    1. 新建线程 一个java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是一个多线程程序,包含了:(1)分发处理发送给给JVM信号的线程 ...

  10. css3,css的基础全局运用

    浮动 1.浮动起来的盒子不占用位置,浮动了一个盒子下面的标准流的盒子会顶上来 ​ 可用清除浮动的方法来解决标准流会顶替位置的问题 清除浮动给父盒子加overflow: hidden; 鼠标经过事件 : ...