【axios】的淺度分析

一、Axios的攔截器能干些什么?

Axios攔截器的實現原理主要涉及兩個方面:請求攔截器和響應攔截器,它們分別在請求發送前和響應返回后進行預處理和后處理。

Axios內部維護了兩個數組,一個用于存儲請求攔截器,另一個用于存儲響應攔截器。每個攔截器都是一個函數,這些函數按照它們在數組中定義的順序被依次執行。

1、請求攔截器:

當Axios發起一個請求時,會首先遍歷并執行請求攔截器數組中的每個函數。
請求攔截器的作用是在請求發送前對請求進行修改或添加一些公共的邏輯,例如給每個請求體都加上token,或者修改請求的配置,如headers、url、params等。此外,也可以在此階段取消請求。
請求攔截器的修改或添加的配置將被用于之后的請求發送。

2、響應攔截器:

一旦請求被發送并得到響應,Axios會遍歷并執行響應攔截器數組中的每個函數。
響應攔截器的作用是在響應返回后對響應進行特定的處理,例如對返回的數據進行統一處理或對特定的錯誤進行處理。
如果響應是一個正常的響應,可以直接返回數據或對數據進行修改。如果響應是一個錯誤(例如,404或500狀態碼),可以進行錯誤處理或重試邏輯。

使用Axios攔截器的好處包括統一處理公共邏輯,減少重復代碼,提高代碼的可讀性和可維護性。同時,也可以在請求或響應不符合預期時進行統一處理,提高程序的健壯性。

需要注意的是,在使用Axios攔截器時,應確保請求攔截器在響應攔截器之前執行,避免邏輯上的錯誤。此外,應避免在攔截器中修改原始請求或響應數據,以免影響其他攔截器或請求處理器的處理結果。同時,應考慮性能問題,避免在攔截器中進行耗時的操作。

綜上所述,Axios攔截器的實現原理主要基于其內部維護的請求和響應攔截器數組,通過依次執行這些攔截器函數,實現對請求和響應的預處理和后處理。

二、Axios 源碼中,攔截器是怎么實現的?(最簡化的理解)

Axios 的攔截器實現基于 Axios 的核心原理,即 Axios 實例是一個包含請求和響應攔截器堆棧的對象。當發出請求或接收響應時,Axios 會遍歷這些攔截器,并按照添加的順序執行請求攔截器,以及按照相反的順序執行響應攔截器。
在 Axios 的源碼中,攔截器是通過一個 AxiosInterceptorManager 實例來管理的,它維護了一個攔截器數組。每個攔截器都是一個包含 fulfilledrejected 函數的對象。這兩個函數分別對應于攔截器成功處理和攔截器處理出錯的情況。
以下是 Axios 攔截器管理器的一個簡化版本,展示了其核心實現思路:

class InterceptorManager {constructor() {this.handlers = []; // 存儲攔截器的數組}use(fulfilled, rejected) {this.handlers.push({fulfilled: fulfilled,rejected: rejected});return this.handlers.length - 1; // 返回攔截器的ID}eject(id) {if (this.handlers[id]) {this.handlers[id] = null; // 移除攔截器}}forEach(fn) {this.handlers.forEach((h) => {if (h !== null) {fn(h);}});}
}

在發送請求或接收響應時,Axios 會創建一個 promise 鏈,并通過 forEach 方法將攔截器中的 fulfilledrejected 函數添加到這個鏈中。這樣,每個攔截器都可以對請求或響應進行處理,然后將結果傳遞到鏈的下一個攔截器,或者在出錯時結束鏈的執行。
PS:注意,上面說的是攔截管理器,并非下面要說的攔截器

axios.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {chain.unshift(interceptor.fulfilled, interceptor.rejected);
});axios.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {chain.push(interceptor.fulfilled, interceptor.rejected);
});

在 Axios 的完整實現中,這個攔截器機制被集成到了 Axios 的請求發送和響應處理流程中。通過這種方式,Axios 可以在發送請求之前和接收響應之后,但在用戶定義的 .then.catch 執行之前,插入自定義的邏輯。
請注意,這里提供的代碼只是為了說明 Axios 攔截器的實現原理,并不是 Axios 源碼的完整復制。

三、高度簡化的源碼(axios攔截器實現源碼)

Axios 攔截器的實現源碼涉及到其核心模塊的設計。Axios 允許你注冊請求攔截器和響應攔截器,這些攔截器在請求發送前和響應返回后進行相應的處理。以下是簡化的 Axios 攔截器實現源碼的概述:

// 假設 Axios 實例有一個 interceptors 對象,其中包含了 request 和 response 兩個數組
const instance = {interceptors: {request: [],response: []}
};// 請求攔截器的函數定義
function onFulfilled(fulfilled, rejected) {return function (config) {return new Promise((resolve, reject) => {try {const result = fulfilled(config);if (result && typeof result.then === 'function') {result.then(resolvedConfig => {resolve(resolvedConfig);}, rejected);} else {resolve(result);}} catch (error) {reject(error);}};};
}// 響應攔截器的函數定義
function onFulfilledResponse(fulfilled, rejected) {return function (response) {return new Promise((resolve, reject) => {try {const result = fulfilled(response);if (result && typeof result.then === 'function') {result.then(resolvedResponse => {resolve(resolvedResponse);}, rejected);} else {resolve(result);}} catch (error) {reject(error);}};};
}// 添加請求攔截器
instance.interceptors.request.use = function (fulfilled, rejected) {this.interceptors.request.push({fulfilled: onFulfilled(fulfilled, rejected),rejected: rejected});return this;
};// 添加響應攔截器
instance.interceptors.response.use = function (fulfilled, rejected) {this.interceptors.response.push({fulfilled: onFulfilledResponse(fulfilled, rejected),rejected: rejected});return this;
};// 簡化版的請求發送函數,用于展示攔截器如何處理
function dispatchRequest(config) {return new Promise((resolve, reject) => {// 遍歷并執行請求攔截器const chain = [Promise.resolve(config)];instance.interceptors.request.forEach(interceptor => {chain.unshift(interceptor.fulfilled, interceptor.rejected);});// 遍歷并執行響應攔截器chain.push(dispatchRequestToServer); // 假設這個函數是實際發送請求到服務器的函數while (chain.length) {const currentInterceptor = chain.shift();const nextInterceptor = chain.shift();if (typeof currentInterceptor === 'function') {currentInterceptor(config).then(chain => {if (typeof nextInterceptor === 'function') {nextInterceptor(chain);} else {resolve(chain);}}).catch(reject);}}});
}// 假設函數,用于實際發送請求到服務器
function dispatchRequestToServer(config) {// 這里應該是實際的請求發送邏輯,為了簡化,我們直接返回一個模擬的響應return Promise.resolve({data: 'Response data'});
}// 使用攔截器
instance.interceptors.request.use(config => {// 在發送請求之前做些什么console.log('Request interceptor called', config);// 可以在這里修改config對象return config;},error => {// 對請求錯誤做些什么return Promise.reject(error);}
);instance.interceptors.response.use(response => {// 對響應數據做點什么console.log('Response interceptor called', response);// 可以在這里修改響應數據return response;},error => {// 對響應錯誤做點什么return Promise.reject(error);}
);// 發送請求
dispatchRequest({ url: 'https://api.example.com/data' }).then(response => {console.log('Response received:', response);}).catch(error => {console.error('Error occurred:', error);});

以上代碼是一個高度簡化的版本,用于展示 Axios 攔截器是如何實現的。如果你對 Axios 的攔截器實現細節感興趣,建議查看 Axios 的官方 GitHub 倉庫中的源碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19133.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19133.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫基礎+增刪查改初階

數據庫基礎增刪查改初階 一。數據庫操作 1.概念: 一個mysql服務器上有很多的表,把有關系的表放在一起就構成了一個數據集合,此時稱為“數據庫”,一個mysql1服務器上可以有多個這樣的數據庫 2.創建數據庫: create …

穩住!一招制勝:打造JavaScript防抖函數的終極指南【含代碼示例】

穩住!一招制勝:打造JavaScript防抖函數的終極指南【含代碼示例】 防抖函數:概念與作用基礎實現:案例一簡單防抖函數使用示例 進階功能:案例二 - 立即執行版本性能優化與安全考量實戰技巧與問題排查實際問題與解決方案結…

基于python flask的旅游數據大屏實現,有爬蟲有數據庫

背景 隨著旅游行業的快速發展,數據在旅游決策和規劃中的重要性日益凸顯。基于 Python Flask 的旅游數據大屏實現研究旨在結合爬蟲技術和數據庫存儲,為用戶提供全面、實時的旅游信息展示平臺。 爬蟲技術作為數據采集的重要手段,能夠從各種網…

錯誤記錄:從把項目從Tomcat8.5.37轉到Tomcat10.1.7

錯誤信息:在本地Servlet項目里沒有報錯,但是瀏覽器跳轉該servlet時報錯 型 異常報告 消息 實例化Servlet類[com.wangdao.lx.MyServlet1]異常 描述 服務器遇到一個意外的情況,阻止它完成請求。 例外情況 jakarta.servlet.ServletExceptio…

Generative Action Description Prompts for Skeleton-based Action Recognition

標題:基于骨架的動作識別的生成動作描述提示 源文鏈接:https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…

解決文件傳輸難題:如何繞過Gitee的100MB上傳限制

引言 在版本控制和代碼托管領域,Gitee作為一個流行的平臺,為用戶提供了便捷的服務。然而,其對單個文件大小設定的100MB限制有時會造成一些不便。 使用云存儲服務 推薦理由: 便捷性:多數云存儲服務如: Dro…

現代操作系統上創建各類鏈接的方法匯總

文章目錄 現代操作系統上創建各類鏈接的方法匯總windows: cmd下的mklink創建鏈接示例 powershell 創建鏈接創建常規文件和目錄創建鏈接 linux shell 創建硬鏈接NAMESYNOPSIS詳細說明常用選項示例 檢查與辨識符號鏈接🎈linux下檢查ls -l 命令file 命令 windows下檢查…

零基礎學習圖生圖

目錄 一、圖生圖是什么二、安裝秋葉整合包2.1 秋葉包安裝2.2 秋葉包拓展安裝:2.3 ckpt配置:2.4 界面常用功能配置: 三、圖生圖基本功能展示3.1 圖生圖的界面3.2 重要的參數設置:3.3 涂鴉功能3.4 局部重繪功能3.5 涂鴉重繪3.6 上傳…

SQL 語言:存儲過程和觸發器

文章目錄 基本概述創建觸發器更改和刪除觸發器總結 基本概述 存儲過程,類似于高階語言的函數或者方法,包含SQL語句序列,是可復用的語句,保存在數據庫中,在服務器中執行。特點是復用,提高了效率&#xff0c…

網絡智能化的發展對仿真環境的需求

1. 網絡智能化背景介紹 1.1 什么是網絡智能化 網絡智能化是指利用人工智能(AI)、機器學習(ML)、優化算法等技術來實現網絡的信息化、自動化和智能化。相對5G、6G、算力網絡等領域,網絡智能化是針對網絡全場景、全要素…

使用C語言openssl庫實現 RSA加密 和 消息驗證

Q:什么是RSA? A:RSA(Rivest-Shamir-Adleman)是一種非對稱加密算法,是最早的一種用于公開密鑰加密和數字簽名的算法。它使用一對公鑰(public key)和私鑰(private key&…

去掉macOS終端命令行前的(base)

macOS在安裝了Anaconda(或miniconda)后,每次打開terminal都會默認打開名為base的虛擬環境。 默認不啟動base conda config --set auto_activate_base false默認啟動base conda config --set auto_activate_base true

IEEE Latex模版踩雷避坑指南

參考文獻 原Latex模版 \begin{thebibliography}{1} \bibliographystyle{IEEEtran}\bibitem{ref1} {\it{Mathematics Into Type}}. American Mathematical Society. [Online]. Available: https://www.ams.org/arc/styleguide/mit-2.pdf\bibitem{ref2} T. W. Chaundy, P. R. Ba…

【前端每日基礎】day27——小程序開發

小程序開發詳細介紹 基本概念 小程序:小程序是一種無需下載安裝即可使用的應用。用戶通過微信搜索或掃描二維碼即可打開小程序。小程序具有觸手可及、用完即走、體驗良好的特點。 組成部分: WXML:用于描述頁面的結構。 WXSS:用于…

2022職稱繼續教育--深入實施新時代人才強國戰略 加快建設世界重要人才中心和創新高地

單選題(共7題,每題5分) 1、()實行職位職級制工資為主。 D、中長線科研重要崗位人員 2、建設世界重要人才中心和創新高地有()個階段目標。 B、三 3、綜合國力競爭說到底是(&#xf…

基于 FastAI 文本遷移學習的情感分類(93%+Accuracy)

前言 系列專欄:【深度學習:算法項目實戰】?? 涉及醫療健康、財經金融、商業零售、食品飲料、運動健身、交通運輸、環境科學、社交媒體以及文本和圖像處理等諸多領域,討論了各種復雜的深度神經網絡思想,如卷積神經網絡、循環神經網絡、生成對…

[vue3后臺管理二]首頁和登錄測試

[vue3后臺管理二]首頁和登錄測試 1 修改main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)2 路由創建 import {createRouter, createWebHistory} from vue-ro…

計算機網絡學習筆記——運輸層(b站)

目錄 一、 運輸層概述 二、運輸層端口號、復用與分用的概念 三、UDP和TCP的對比 四、TCP的流量控制 五、TCP的擁塞控制 六、TCP超時重傳時間的選擇 七、TCP可靠傳輸的實現 八、TCP報文段的首部格式 一、 運輸層概述 物理層、數據鏈路層、網絡層實現了主機到主機的通信…

使用springdoc-openapi-starter-webmvc-ui后訪問swagger-ui/index.html 報錯404

按照官網說明,引入 springdoc-openapi-starter-webmvc-ui后應該就可以直接訪問swagger-ui.html或者swagger-ui/index.html就可以出現swagger頁面了,但是我引入后,訪問提示報錯404. 在我的項目中,有其他依賴間接引入了org.webjars…

剪映網頁版

https://www.capcut.cn/web 免費,免安裝,跨平臺,視頻云合成,簡直太好用了!