日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何實現axios的自定義適配器adapter

瀏覽:239日期:2023-06-03 14:25:28
目錄1. 適配器要實現的功能1.1 promise 和工具1.2 響應的格式1.3 超時設置1.4 主動取消請求2. 編寫自定義適配器3. 將適配器添加到 axios 中4. 總結1. 適配器要實現的功能

我們在基于 axios 實現額外的數據模塊時,應當與 axios 的模式進行對齊。因此在返回的數據格式上,實現的功能上盡量保持一致。

1.1 promise 和工具

所有的適配均應當實現為 Promise 方式。

而且,有些功能的實現,axios 將其下放到了適配器中自己進行實現,例如

url 的拼接:即 baseURL 和 url 的拼接,若存在 baseURL 且 url 為相對路徑,則進行拼接,否則直接使用 url; 參數的拼接:若是 get 請求,需要自行將 object 類型拼接為 url 參數的格式并與 url 拼接完成;

這是自己需要實現的兩個基本的工具方法。

1.2 響應的格式

這里我們要注意到請求接口正常和異常的格式。

接口正常時:

const result = { status: 200, // 接口的http 狀態 statusText: ’ok’, config: ’config’, // 傳入的config配置,原樣返回即可,方便在響應攔截器和響應結果中使用 data: {}, // 真實的接口返回結果};

接口異常時,我們可以看下 axios 源碼中對錯誤信息的處理createError,enhanceError(createError 中調用了 enhanceError),首先會創建一個 error 實例,然后給這個 error 實例添加一個屬性:

module.exports = function enhanceError(error, config, code, request, response) { error.config = config; if (code) {error.code = code; } error.request = request; error.response = response; error.isAxiosError = true; error.toJSON = function toJSON() {return { // Standard message: this.message, name: this.name, // Microsoft description: this.description, number: this.number, // Mozilla fileName: this.fileName, lineNumber: this.lineNumber, columnNumber: this.columnNumber, stack: this.stack, // Axios config: this.config, code: this.code,}; }; return error;};

可以看到,除了正常的錯誤信息外,還加入了很多別的屬性,例如 request, response, config 等。這里我們在自己實現適配器時,最好也要這樣統一編寫,方便更上層的業務層統一處理,避免為單獨的適配器進行特殊處理。

關于 1.1 和 1.2 中的內容,若不進行打包編譯,則需要自己實現。若還要通過 webpack 等打包工具編譯一下的,可以直接引用 axios 中的方法,不用自己實現了,參考官方基于 axios 實現的mock-axios。例如:

import axios from ’axios’;import buildURL from ’axios/lib/helpers/buildURL’;import isURLSameOrigin from ’axios/lib/helpers/isURLSameOrigin’;import btoa from ’axios/lib/helpers/btoa’;import cookies from ’axios/lib/helpers/cookies’;import settle from ’axios/lib/core/settle’;import createError from ’axios/lib/core/createError’;

然后直接使用就行了,不用再進行二次開發。

1.3 超時設置

我們不能無限地等待第三方服務的響應,如果第三方服務無響應或者響應時間過長,應當適時的終止掉。在 axios 中,前端使用了XMLHttpRequest,在 node 端使用了http,來實現接口的請求,兩者都有超時的設定,可以設置 timeout 字段來設置超時的時間,自動取消當前的請求。

像有的發起的請求,自己并沒有超時的設定,例如 jsonp,是用創建一個 script 標簽來發起的請求,這個請求必須等到服務器有響應才會終止(成功或者失敗)。這時,就需要我們自己用一個setTimeout來模擬了,但這樣,即使返回給業務層說“超時了,已取消當前請求”,但實際上請求還在,只不過若超過規定時間,只是不再執行對應的成功操作而已。

1.4 主動取消請求

我們也會有很多并沒有到超時時間,就需要主動取消當前請求的場景,例如在請求返回之前就切換了路由;上次請求還沒響應前,又需要發出新的請求等。都需要主動地取消當前請求。

axios 中已經提供了取消請求的功能,我們只需要按照規則接入即可。我們來看下 XMLHttpRequest 請求器中是怎么取消請求的,在寫自定義請求器時也可以照理使用。

在lib/adapters/xhr.js#L158中:

// 若config中已經配置了cancelTokenif (config.cancelToken) { // Handle cancellation // 若在外城執行了取消請求的方法,則這里將當前的請求取消掉 config.cancelToken.promise.then(function onCanceled(cancel) {if (!request) { return;}// xhr中使用abort方法取消當前請求request.abort();reject(cancel);// Clean up requestrequest = null; });}

我們在寫自己的適配器時,也可以將這段拷貝過去,將內部取消的操作更換為自己的即可。

到這里,若把上面的功能都實現了,就已經完成了一個標準的適配器了。

2. 編寫自定義適配器

每個人需要的適配器肯定也不一樣,復雜度也不一樣,例如有的想接入小程序的請求,我自己想接入客戶端里提供的數據請求方式等。我們這里只是通過實現一個簡單的jsonp適配器來講解下實現方式。

我們以 es6 的模塊方式來進行開發。所有的實現均在代碼中進行了講解。

// 這里的config是axios里所有的配置const jsonpAdapter = (config) => { return new Promise((resolve, reject) => {// 是否已取消當前操作// 因jsonp沒有主動取消請求的方式// 這里使用 isAbort 來標識let isAbort = false;// 定時器標識符let timer = null;// 執行方法的名字,const callbackName = `jsonp${Date.now()}_${Math.random() .toString() .slice(2)}`;// 這里假設已經實現了baseURL和url的拼接方法const fullPath = buildFullPath(config.baseURL, config.url);// 這里假設已經實現了url和參數的拼接方法// 不太一樣的地方在于,jsonp需要額外插入一個自己的回調方法const url = buildURL( fullPath, {...config.params,...{ [config.jsonpCallback || ’callback’]: callbackName }, }, config.paramsSerializer);// 創建一個script標簽let script = document.createElement(’script’);// 成功執行操作后function remove() { if (script) {script.onload = script.onerror = null;// 移除script標簽if (script.parentNode) { script.parentNode.removeChild(script);}// 取消定時器if (timer) { clearTimeout(timer);}script = null; }}// 成功請求后window[callbackName] = (data) => { // 若已需要請求,則不再執行 if (isAbort) {return; } // 返回的格式 const response = {status: 200,statusText: ’ok’,config,request: script,data: data, }; remove(); // 實際上這里上一個settle操作,會額外判斷是否是合理的status狀態 // 若我們在config.validateStatus中設置404是合理的,也會進入到resolve狀態 // 但我們這里就不實現這個了 // settle(resolve, reject, response); resolve(response);};// 請求失敗script.onerror = function (error) { remove(); reject(createError(’Network Error’, config, 404));};// 若設置了超時時間if (config.timeout) { timer = setTimeout(function () {remove();// 取消當前操作isAbort = true;reject( createError(’timeout of ’ + config.timeout + ’ms exceeded’,config,405 )); }, config.timeout);}// 若定義了取消操作if (config.cancelToken) { config.cancelToken.promise.then(function () {if (!script) { return;}remove();isAbort = true;reject(createError(’Cancel Error’, config, 404)); });}script.src = url;const target = document.getElementsByTagName(’script’)[0] || document.head;target.parentNode && target.parentNode.insertBefore(script, target); });};export default jsonpAdapter;3. 將適配器添加到 axios 中

axios 的 config 提供了 adapter 字段讓我們插入自己的適配器。使用自定義適配器又有兩種情況:

1.完全只使用自定義的適配器;

2.在某種情況下使用自定義適配器,其他情況時還是使用 axios 自己的適配器。

第 1 種情況還好,只需要 return 自己適配器返回的結果結果即可;而第 2 種情況中,則有個小坑需要踩一下,我們這里也只講解下第 2 種情況。我要把剛才實現的 jsonp 適配器添加到 axios 中,并且只在參數有format=jsonp時才調用該適配器,其他還是用的 axios 提供的適配器。

import Axios from ’axios’;import jsonpAdapter from ’./jsonpAdater’;const request = Axios.create({ adapter: (config) => {if (config?.params?.format === ’jsonp’) { return jsonpAdapter(config);}// 這里需要將config.adapter設置為空// 否則會造成無限循環return defaultAxios({ ...config, ...{ adapter: undefined } }); },});

使用自定義的適配器 jsonp 發起請求。

// 使用自定義的適配器jsonp發起請求var options = { params: {format: ’jsonp’, },};request( ’https://api.prize.qq.com/v1/newsapp/answer/share/oneQ?qID=506336’, options) .then(function (response) {console.log(’jsonp response’, response); }) .catch(function (error) {console.error(’jsonp error’, error); });

使用 axios 默認的適配器發起請求。

// 使用axios默認的適配器發起請求request(’https://api.prize.qq.com/v1/newsapp/answer/share/oneQ?qID=506336’) .then(function (response) {console.log(’axios response’, response); }) .catch(function (error) {console.error(’axios error’, error); });4. 總結

這里,我們就已經實現了一個自定義適配器了,在滿足一定條件時可以觸發這個適配器。通過這個思路,我們也可以實現一個自定義的 mock 方法,例如當參數中包含format=mock時則調用 mock 接口,否則就正常請求。

以上就是如何實現axios的自定義適配器adapter的詳細內容,更多關于axios自定義適配器adapter的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美手机在线| 国产精品一区二区美女视频免费看 | 久久国产成人午夜av影院宅| 国产一区二区三区四区二区| 美女久久久久久| 精品网站aaa| 高清一区二区| 亚洲精品国产嫩草在线观看| 九九精品调教| 蜜桃tv一区二区三区| 午夜精品婷婷| 黑丝一区二区三区| 免费黄网站欧美| 午夜精品福利影院| 国产欧美一区二区精品久久久| 麻豆国产欧美一区二区三区 | 电影91久久久| 日本欧美不卡| 美女精品网站| 奇米777国产一区国产二区| 美女在线视频一区| 日本精品影院| 最新亚洲激情| 亚洲欧洲专区| 鲁大师精品99久久久| 国产aa精品| 免费毛片在线不卡| 蜜桃视频免费观看一区| 国产亚洲观看| 成人自拍av| 亚洲精品婷婷| 精品国产欧美| 91精品电影| 午夜精品影视国产一区在线麻豆| 牛牛精品成人免费视频| 91精品国产乱码久久久久久久| 热久久久久久久| 国产毛片一区二区三区| 色网在线免费观看| 亚洲一区二区三区免费在线观看 | 国产精品夜夜夜| 桃色一区二区| 热久久国产精品| 精品久久久中文字幕| 亚洲激情国产| 久久一区视频| 欧美日韩激情在线一区二区三区| 一本综合精品| 91日韩免费| 亚洲精品视频一二三区| 麻豆国产一区| 最新亚洲一区| 久久在线91| 首页亚洲欧美制服丝腿| 久久影院资源站| 丝袜a∨在线一区二区三区不卡| 精品视频免费| 免费在线观看视频一区| 国产成人精品一区二区免费看京| 亚洲综合二区| 国产精品毛片久久| 美国三级日本三级久久99| 丁香婷婷久久| 亚洲久草在线| 成人久久一区| 91伊人久久| 欧洲毛片在线视频免费观看| 国产精品宾馆| 免费在线观看精品| 日韩一区自拍| 日韩福利视频导航| 午夜久久福利| 日韩精品诱惑一区?区三区| 婷婷综合福利| 欧美日韩国产综合网| 精品视频自拍| 最新亚洲国产| 中文另类视频| 国产精品一区二区精品视频观看 | 欧美在线观看视频一区| 国产精品theporn| 蜜臀av一区二区在线免费观看| 国产精品久久久久蜜臀| 国产欧美自拍一区| 一区二区三区网站| 免费观看久久av| 日韩中文在线播放| 手机在线电影一区| 卡一卡二国产精品| 日韩高清二区| 日韩视频一区| 日韩精品水蜜桃| 精品三级在线观看视频| 欧美久久久网站| 综合国产精品| 黄色精品网站| 99成人在线视频| 91一区二区三区四区| 欧美一级全黄| 欧美一区自拍| 色8久久久久| 亚洲精品伊人| 免费在线观看一区二区三区| 中文久久精品| 尤物在线精品| 欧美 日韩 国产一区二区在线视频 | 久久精品超碰| 婷婷成人av| 亚洲性视频在线| 性一交一乱一区二区洋洋av| 欧美在线资源| 亚洲黄色在线| 久久不射中文字幕| 99国产一区| 激情综合网站| 91九色精品| 亚洲先锋成人| 欧美精品一区二区久久| 亚洲高清久久| 欧美日韩在线二区| 亚洲电影在线| 婷婷激情综合| 国产视频一区三区| 欧美日韩四区| 美国欧美日韩国产在线播放| 亚洲欧美日韩在线观看a三区| 午夜免费一区| 午夜亚洲一区| 一区二区不卡| 日韩免费精品| 久久精品99久久久| 欧美激情aⅴ一区二区三区 | 精品国产中文字幕第一页| 麻豆精品视频在线观看视频| 美腿丝袜在线亚洲一区| 麻豆高清免费国产一区| 精品一区二区三区视频在线播放 | 国产一区二区久久久久| 蜜桃精品视频| 国产中文在线播放| 久久久精品五月天| 欧美日韩三区| 亚洲最新av| 国产精品久久久久久久久久白浆| 国产精品传媒麻豆hd| 91青青国产在线观看精品| 日韩精品麻豆| 中文日韩欧美| 日韩精品导航| 精品72久久久久中文字幕| 日韩电影免费在线观看| japanese国产精品| 日韩激情综合| 欧美激情三区| 在线日韩一区| 日韩美女精品| 亚洲欧洲高清| 日韩专区欧美专区| 国产视频网站一区二区三区| 成人自拍av| 亚洲毛片在线免费| 国产精品亚洲综合久久| а√在线中文在线新版| 午夜影院欧美| 日本午夜精品久久久| 久久精品国产999大香线蕉| 久久在线视频免费观看| 综合激情网...| 美女国产一区二区三区| 欧美日韩水蜜桃| 91亚洲精品在看在线观看高清| 国产盗摄——sm在线视频| 亚洲精品99| 国产精品色婷婷在线观看| 成人久久一区| 日韩高清国产一区在线| se01亚洲视频| 亚洲精品观看| 日韩天堂在线| 日韩国产欧美三级| 久久精品国产www456c0m| 日韩动漫一区| 亚洲网站视频| 国产欧美午夜| 激情久久久久久久| 国产亚洲字幕| 欧美成人精品| 国产精品对白久久久久粗| 亚洲欧洲日本mm| 国产成人免费| 日韩精品乱码av一区二区| 久久视频精品| 久久av导航| 中文字幕一区二区三区在线视频| 97人人精品| 日韩av黄色在线| 99精品99| av中文字幕在线观看第一页| 蜜桃免费网站一区二区三区| 日韩中文在线电影|