摘要:響應(yīng)的攔截器接收到的是對象至此,我們已經(jīng)把的核心邏輯閱讀完畢,從中我們也可以看到的易用性和可拓展性非常強(qiáng)。尤其是可拓展性,發(fā)送請求到接收響應(yīng)的過程中的所有部分幾乎都是可拓展的,尤其是,,留下了很多想象的空間。
為了方便使用,axios對象既能做對象使用,又能做函數(shù)使用.
axios.post("/user", { firstName: "Fred", lastName: "Flintstone" }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); }); axios({ method: "post", url: "/user/12345", data: { firstName: "Fred", lastName: "Flintstone" } });
這一點(diǎn)axios是如何做到的,可以看到instance其實(shí)是一個(gè)綁定this的函數(shù),調(diào)用axios就是調(diào)用context.request
function createInstance(){ // 能當(dāng)做函數(shù)使用的秘密 var instance = bind(Axios.prototype.request, context); // 能當(dāng)做對象使用的秘密 utils.extend(instance, Axios.prototype, context); // 要拿到構(gòu)造函數(shù)繼承的屬性 utils.extend(instance, context); return instance } var axios = createInstance(defaults);
接下來我們看一下request方法,所有http請求的發(fā)送都會調(diào)用Axios.prototype.request,這個(gè)函數(shù)可以認(rèn)為是整個(gè)axios的骨架,非常重要。
Axios.prototype.request = function request(config) { // 每個(gè)請求都會重新合成一個(gè)config,所以通過操作config對象,你可以標(biāo)識請求,做某些操作,事實(shí)上每個(gè)axios的攔截器都能拿到config對象 config = utils.merge(defaults, this.defaults, { method: "get" }, config); // 掛載攔截器的主要邏輯 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); }); while (chain.length) { promise = promise.then(chain.shift(), chain.shift()); } return promise; }
從攔截器中的主要邏輯,我們可以得到以下幾點(diǎn):
發(fā)送請求的整個(gè)執(zhí)行順序是,requestInterceptors ——》dispatchRequest ——》responseInterceptors
攔截器最初接收的對象是config,axios使用中也規(guī)定,請求的攔截器必須要返回config,這也是每個(gè)請求攔截器的函數(shù)參數(shù)是config的原因
攔截器的執(zhí)行順序與interceptors.request.use(function () {/*...*/})執(zhí)行的順序有關(guān),即先use的請求攔截器會先執(zhí)行。
如果攔截器中的函數(shù)時(shí)async函數(shù),會阻塞整個(gè)攔截器鏈的執(zhí)行,而transformData不會,所以如果需要對請求的數(shù)據(jù)做異步處理的話,要在攔截器中完成。
看一下,不同的http method是怎么復(fù)用request方法的
utils.forEach(["delete", "get", "head", "options"], function forEachMethodNoData(method) { /*eslint func-names:0*/ Axios.prototype[method] = function(url, config) { return this.request(utils.merge(config || {}, { method: method, url: url })); }; }); utils.forEach(["post", "put", "patch"], function forEachMethodWithData(method) { /*eslint func-names:0*/ Axios.prototype[method] = function(url, data, config) { return this.request(utils.merge(config || {}, { method: method, url: url, data: data })); }; });
接下來我們看dispatchRequest的核心邏輯:
// 處理config... var adapter = config.adapter || defaults.adapter; return adapter(config).then(function onAdapterResolution(response) { throwIfCancellationRequested(config); // Transform response data response.data = transformData( response.data, response.headers, config.transformResponse ); return response; }, function onAdapterRejection(reason) { if (!isCancel(reason)) { throwIfCancellationRequested(config); // Transform response data if (reason && reason.response) { reason.response.data = transformData( reason.response.data, reason.response.headers, config.transformResponse ); } } return Promise.reject(reason); });
可以看到dispatchRequest的核心邏輯大概有三步
處理config
使用adapter發(fā)送請求,axios默認(rèn)內(nèi)置兩個(gè)adapter,一個(gè)是負(fù)責(zé)在brower發(fā)送請求的,一個(gè)是負(fù)責(zé)在node端發(fā)送請求,可以在根文件的defaults下看到
構(gòu)造響應(yīng)數(shù)據(jù)
所以通過dispatchRequest方法的閱讀,我們可以得到以下啟示:
adapter是可以替換的,所以如果你覺得你的xhr或http的邏輯更適合業(yè)務(wù)的需要,完全可以替換掉,你也完全可以開發(fā)出第三種adapter以處理特定情況,比如開發(fā)一個(gè)處理緩存的adapter,事實(shí)上我現(xiàn)在的項(xiàng)目就是這樣做的。
響應(yīng)的攔截器接收到的是response對象
至此,我們已經(jīng)把a(bǔ)xios的核心邏輯閱讀完畢,從中我們也可以看到axios的易用性和可拓展性非常強(qiáng)。
尤其是可拓展性,發(fā)送請求到接收響應(yīng)的過程中的所有部分幾乎都是可拓展的,尤其是config,adapter,interceptor留下了很多想象的空間。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95113.html
摘要:開始研究核心代碼這個(gè)類首先是構(gòu)造函數(shù)看完上面的內(nèi)容大家應(yīng)該有點(diǎn)印象,上掛了和,是默認(rèn)的配置,顧名思義就是攔截器,目測包含了和兩種類型。喜歡就點(diǎn)個(gè)贊吧參考文章源代碼重點(diǎn)難點(diǎn)分析源代碼重點(diǎn)難點(diǎn)分析 axios是一個(gè)基于promise的http庫,支持瀏覽器和node端,最近我在做beauty-we的api設(shè)計(jì),研讀一個(gè)成熟的http庫勢在必行,axios功能完整、api簡潔、注釋清晰,再適...
摘要:總所周知,的策略讓每次都要發(fā)送碼驗(yàn)證,為了方便,我在的里作了前置攔截。結(jié)果不幸從此發(fā)生最開始沒有看官方文檔,以為應(yīng)該加在里面,又沒有考慮到要上傳格式的文檔,所以直接結(jié)果發(fā)送的是。這很正常,閱讀源碼知為時(shí)會自動添加的頭。不加又以上傳了。 總所周知,egg的csrf策略讓post每次都要發(fā)送token碼驗(yàn)證,為了方便,我在axios的interceptor里作了前置攔截。 結(jié)果不幸從此發(fā)生...
摘要:我們先來看看構(gòu)造函數(shù)構(gòu)造函數(shù)就是用來實(shí)現(xiàn)攔截器的,這個(gè)構(gòu)造函數(shù)原型上有個(gè)方法。關(guān)于源碼,其實(shí)是比較簡單的,都是用來操作該構(gòu)造函數(shù)的實(shí)例屬性的。存放攔截器方法,數(shù)組內(nèi)每一項(xiàng)都是有兩個(gè)屬性的對象,兩個(gè)屬性分別對應(yīng)成功和失敗后執(zhí)行的函數(shù)。 Axios源碼分析 - XHR篇 文章源碼托管在github上,歡迎fork指正! axios 是一個(gè)基于 Promise 的http請求庫,可以用在瀏覽...
摘要:一個(gè)基于全家桶開發(fā)的仿知乎日報(bào)單頁應(yīng)用項(xiàng)目地址源碼地址項(xiàng)目在線地址在線地址模式下推薦使用移動端模式瀏覽去觀看如果覺得做得還不錯(cuò)或者項(xiàng)目源碼對您有幫助希望您小抬右手到右上角點(diǎn)一個(gè)您的支持是作者長期更新維護(hù)的動力項(xiàng)目起源從二月份開始學(xué)習(xí)學(xué)習(xí)了 Vue-News 一個(gè)基于vue全家桶開發(fā)的仿知乎日報(bào)單頁應(yīng)用 項(xiàng)目github地址:源碼地址 項(xiàng)目在線地址:在線地址 (PC模式下推薦使用chro...
摘要:愛上閱讀,是一款的讀小說等書籍的并且閱讀的應(yīng)用。找了好久發(fā)現(xiàn)發(fā)現(xiàn)只有追書神器的暴露出來了,起點(diǎn)之類的找不到。八最后最后打個(gè)小廣告源碼都已在上開源,目前在逐步完善功能中。歡迎感興趣的同學(xué)和。 loveBook loveBook愛上閱讀,是一款webapp的讀小說等書籍的并且閱讀的應(yīng)用。如果覺得可以,歡迎fork和star。 自己最近在追斗破蒼穹電視劇,下班時(shí)候在地鐵上總聽到有人說,斗破蒼...
閱讀 3334·2021-11-22 12:04
閱讀 2718·2019-08-29 13:49
閱讀 491·2019-08-26 13:45
閱讀 2249·2019-08-26 11:56
閱讀 1007·2019-08-26 11:43
閱讀 601·2019-08-26 10:45
閱讀 1275·2019-08-23 16:48
閱讀 2164·2019-08-23 16:07