axios源码解析 - 请求拦截器
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源码解析 - 请求拦截器的更多相关文章
- axios 源码解析(下) 拦截器的详解
axios的除了初始化配置外,其它有用的应该就是拦截器了,拦截器分为请求拦截器和响应拦截器两种: 请求拦截器 ;在请求发送前进行一些操作,例如在每个请求体里加上token,统一做了处理如果以后要 ...
- Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor
### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](htt ...
- Okhttp3源码解析(4)-拦截器与设计模式
### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](htt ...
- 源码解析Grpc拦截器(C#版本)
前言 其实Grpc拦截器是我以前研究过,但是我看网上相关C#版本的源码解析相对少一点,所以笔者借这篇文章给大家分享下Grpc拦截器的实现,废话不多说,直接开讲(Grpc的源码看着很方便,包自动都能还原 ...
- axios源码解析 - 请求方法的别名实现
axios中的创建请求方式很多,比如axios(url),axios.get(url),axios.post(url),axios.delete(url),方便快捷的api设计让axios火得一塌糊涂 ...
- springMVC源码分析之拦截器
一个东西用久了,自然就会从仅使用的层面上升到探究其原理的层面,在javaweb中springmvc更是如此,越是优秀的框架,其底层实现代码更是复杂,而在我看来,一个优秀程序猿就相当于一名武林高手,不断 ...
- springMVC源码分析--HandlerInterceptor拦截器调用过程(二)
在上一篇博客springMVC源码分析--HandlerInterceptor拦截器(一)中我们介绍了HandlerInterceptor拦截器相关的内容,了解到了HandlerInterceptor ...
- axios 源码解析(中) 代码结构
axios现在最新的版本的是v0.19.0,本节我们来分析一下它的实现源码,首先通过 gitHub地址获取到它的源代码,地址:https://github.com/axios/axios/tree/v ...
- Struts 2.3.24源码解析+Struts2拦截参数,处理请求,返回到前台过程详析
Struts2官网:http://struts.apache.org/ 目前最新版本:Struts 2.3.24 Struts1已经完全被淘汰了,而Struts2是借鉴了webwork的设计理念而设计 ...
随机推荐
- memcached 能够更有效地使用内存吗?
Memcache 客户端仅根据哈希算法来决定将某个 key 存储在哪个节点上,而不考 虑节点的内存大小.因此,您可以在不同的节点上使用大小不等的缓存.但是一 般都是这样做的:拥有较多内存的节点上可以运 ...
- flash的TotalFrames显示undefined
通过js来操作flash的时候,获取到总帧数的是属性.TotalFrames,而不是属性TotalFrames().在asp.net中,js放在最后可以在一定程度上避免当前flash没有加载完,导致获 ...
- CSS揭秘之《背景图案》
网格 html { background: #58a; background-image: linear-gradient(white 2px, transparent 0), linear-grad ...
- 手机上无法显示Toast信息
关于手机上无法显示Toast信息, 是因为手机上的权限没有开, 在应用管理处将所有权限都打开,就可以显示了.
- Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
报错详细: Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preco ...
- SecureCRT显示连接失败的原因
问题描述:连接后像192.168.111.140那样的红色图标 原因:没有开启对应的虚拟机 解决办法:打开对应的虚拟机
- vue获取验证码倒计时
<template> <div> <el-button :disabled="disabled" @click="sendcode" ...
- 使用flex的同时设置超出喜爱是省略号,
超出宽度,显示省略号 overflow:hidden; white-space:nowrap; text-overflow:ellipsis; 需要注意的是,在移动端在flex元素中的内容进行省略文字 ...
- Hadoop-集群运行
目录 步骤一.NameNode 格式化 步骤二.启动 NameNode 步骤三.启动 SecondaryNameNode 步骤四.slave 启动 DataNode 步骤五.查看 HDFS 的报告 步 ...
- SpringCloud Alibaba入门之Nacos(SCA)
SpringCloud Alibaba Spring Cloud Alibaba 致力于提供微服务开发 的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Clo ...