Axios源码解析:请求响应拦截器
1.第一次写博客,关于前端开发deMVC在js中的应用2.react开发中的小细节3.CSS开启硬件加速来提高网站性能4.js中this的指向问题5.Js面向对象构造函数继承6.Js面向对象原型~构造函数7.JavaScript如何工作:垃圾回收机制 + 常见的4种内存泄漏8.Promise核心原理解析9.图解javascript的this指向10.图解javascript原型链11.被闭包啪啪啪的打脸之 闭包的错误使用12.react解析: render的FiberRoot(三)13.个人小程序应用开发指南14.ES2019 / ES10有什么新功能?15.2022前端开发知识总结归纳(前端掌握知识)
16.Axios源码解析:请求响应拦截器
17.AntV G2可视化引擎, 有用过嘛?18.弄懂!ES6中的Iterator迭代器19.🔥[译] 正交设计组件的好处20.小程序开发指南之性能优化21.聊一聊,React开发中应该规避的点22.解析:让你弄懂redux原理23.关于Web GIS基础知识在Axios中拦截器是如何注册和调用的呢?下面我们一起来看看
浏览器端Axios调用流程如下:
初始化Axios——> 注册拦截器 ——> 请求拦截——> ajax请求 ——> 响应拦截 ——> 请求响应回调
Axios初始化
第一步:当然调用Axios请求时初始化了
// 初始化Axios function Axios(instanceConfig) { this.defaults = instanceConfig; this.interceptors = { request: new InterceptorManager(), response: new InterceptorManager() }; } module.exports = Axios;
InterceptorManager和InterceptorManager函数分别是是request拦截器和response拦截器,注册拦截器回调函数,这里只会讲/请求拦截器/,因为响应拦截器基本也是这个流程;这样我们使用axios.request.use
来添加拦截器函数时,实际就是InterceptorManager
实例对象方法,那么这里InterceptorManager
函数做了什么呢?
InterceptorManager注册拦截函数
function InterceptorManager() { this.handlers = []; } //负责将拦截回调函数保存在handlers中 InterceptorManager.prototype.use = function use(fulfilled, rejected) { this.handlers.push({ fulfilled: fulfilled, rejected: rejected }); return this.handlers.length - 1; };
通过axios.request.use
和axios.response.use
请求、回调拦截器添加拦截器,实际就是调用用InterceptorManager
下的use
方法,将回调函数保存在this.handlers
数组中。
调用拦截器函数和请求函数
一下就是调用请求的实际代码,调用Axios
下的request
方法,同时也会先进行一次参数合并
this.request(mergeConfig(config || {}, { method: method, url: url, data: (config || {}).data }));
下面就是request
方法的实际代码,如下:
Axios.prototype.request = function request(config) { // dispatchRequest函数即ajax请求函数 var chain = [dispatchRequest, undefined]; var promise = Promise.resolve(config); this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { chain.unshift(interceptor.fulfilled, interceptor.rejected); }); this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { chain.push(interceptor.fulfilled, interceptor.rejected); }); // 组装 Promise 调用链,完成链式调用 while (chain.length) { promise = promise.then(chain.shift(), chain.shift()); } return promise; };
在上面的代码中chain
变量的实际值是这样的:
chain = [请求回调拦截函数, 请求异常回调拦截函数, dispatchRequest, undefined, 响应回调拦截函数, 响应异常回调拦截函数 ]
然后通过循环,使用Promise链式调用
,来完成请求拦截——> ajax请求 ——> 响应拦截
的功能,最后将结果return
出来,非常的巧妙!!
看下面的就理解了?
参考:
本文来自博客园,作者:herryLo,转载请注明原文链接:https://www.cnblogs.com/liuheng/p/15631863.html
合集:
前端开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具