成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Axios 如何實(shí)現(xiàn)請(qǐng)求重試?

開源
本文介紹了在 Axios 中如何實(shí)現(xiàn)請(qǐng)求重試,基于文中定義的 retryAdapterEnhancer 函數(shù)或響應(yīng)攔截器,你可以輕松地?cái)U(kuò)展請(qǐng)求重試的功能。

[[394882]]

在 Axios 如何取消重復(fù)請(qǐng)求? 這篇文章中,阿寶哥介紹了在 Axios 中如何取消重復(fù)請(qǐng)求及 CancelToken 的工作原理。而本文將介紹在 Axios 中如何通過(guò) 攔截器或適配器 來(lái)實(shí)現(xiàn)請(qǐng)求重試的功能。那么為什么要進(jìn)行請(qǐng)求重試呢?這是因?yàn)樵谀承┣闆r下,比如請(qǐng)求超時(shí)的時(shí)候,我們希望能自動(dòng)重新發(fā)起請(qǐng)求進(jìn)行重試操作,從而完成對(duì)應(yīng)的操作。

下面阿寶哥將介紹如何使用 Axios 提供的攔截器或適配器來(lái)實(shí)現(xiàn)請(qǐng)求重試的功能,如果你對(duì) Axios 的攔截器或適配器還不熟悉的話,建議先閱讀 77.9K 的 Axios 項(xiàng)目有哪些值得借鑒的地方 這篇文章。接下來(lái),我們先來(lái)介紹如何使用攔截器實(shí)現(xiàn)請(qǐng)求重試的方案。

一、攔截器實(shí)現(xiàn)請(qǐng)求重試的方案

Axios 是一個(gè)基于 Promise 的 HTTP 客戶端,而 HTTP 協(xié)議是基于請(qǐng)求和響應(yīng):

所以 Axios 提供了 請(qǐng)求攔截器和響應(yīng)攔截器 來(lái)分別處理請(qǐng)求和響應(yīng),它們的作用如下:

  • 請(qǐng)求攔截器:該類攔截器的作用是在請(qǐng)求發(fā)送前統(tǒng)一執(zhí)行某些操作,比如在請(qǐng)求頭中添加 token 字段。
  • 響應(yīng)攔截器:該類攔截器的作用是在接收到服務(wù)器響應(yīng)后統(tǒng)一執(zhí)行某些操作,比如發(fā)現(xiàn)響應(yīng)狀態(tài)碼為 401 時(shí),自動(dòng)跳轉(zhuǎn)到登錄頁(yè)。

在 Axios 中設(shè)置攔截器很簡(jiǎn)單,通過(guò) axios.interceptors.request 和 axios.interceptors.response 對(duì)象提供的 use 方法,就可以分別設(shè)置請(qǐng)求攔截器和響應(yīng)攔截器:

  1. export interface AxiosInstance { 
  2.   interceptors: { 
  3.     request: AxiosInterceptorManager<AxiosRequestConfig>; 
  4.     response: AxiosInterceptorManager<AxiosResponse>; 
  5.   }; 
  6.  
  7. export interface AxiosInterceptorManager<V> { 
  8.   use(onFulfilled?: (value: V) => V | Promise<V>,  
  9.     onRejected?: (error: any) => any): number; 
  10.   eject(id: number): void; 

對(duì)于請(qǐng)求重試的功能來(lái)說(shuō),我們希望讓用戶不僅能夠設(shè)置重試次數(shù),而且可以設(shè)置重試延時(shí)時(shí)間。當(dāng)請(qǐng)求失敗的時(shí)候,若該請(qǐng)求的配置對(duì)象配置了重試次數(shù),而 Axios 就會(huì)重新發(fā)起請(qǐng)求進(jìn)行重試操作。為了能夠全局進(jìn)行請(qǐng)求重試,接下來(lái)我們?cè)陧憫?yīng)攔截器上來(lái)實(shí)現(xiàn)請(qǐng)求重試功能,具體代碼如下所示:

  1. axios.interceptors.response.use(null, (err) => { 
  2.   let config = err.config; 
  3.   if (!config || !config.retryTimes) return Promise.reject(err); 
  4.   const { __retryCount = 0, retryDelay = 300, retryTimes } = config; 
  5.   // 在請(qǐng)求對(duì)象上設(shè)置重試次數(shù) 
  6.   config.__retryCount = __retryCount; 
  7.   // 判斷是否超過(guò)了重試次數(shù) 
  8.   if (__retryCount >= retryTimes) { 
  9.     return Promise.reject(err); 
  10.   } 
  11.   // 增加重試次數(shù) 
  12.   config.__retryCount++; 
  13.   // 延時(shí)處理 
  14.   const delay = new Promise((resolve) => { 
  15.     setTimeout(() => { 
  16.       resolve(); 
  17.     }, retryDelay); 
  18.   }); 
  19.   // 重新發(fā)起請(qǐng)求 
  20.   return delay.then(function () { 
  21.     return axios(config); 
  22.   }); 
  23. }); 

以上的代碼并不會(huì)復(fù)雜,對(duì)應(yīng)的處理流程如下圖所示:

介紹完如何使用攔截器實(shí)現(xiàn)請(qǐng)求重試的功能之后,下面阿寶哥來(lái)介紹適配器實(shí)現(xiàn)請(qǐng)求重試的方案。

二、適配器實(shí)現(xiàn)請(qǐng)求重試的方案

Axios 引入了適配器,使得它可以同時(shí)支持瀏覽器和 Node.js 環(huán)境。對(duì)于瀏覽器環(huán)境來(lái)說(shuō),它通過(guò)封裝 XMLHttpRequest API 來(lái)發(fā)送 HTTP 請(qǐng)求,而對(duì)于 Node.js 環(huán)境來(lái)說(shuō),它通過(guò)封裝 Node.js 內(nèi)置的 http 和 https 模塊來(lái)發(fā)送 HTTP 請(qǐng)求。

在 Axios 如何緩存請(qǐng)求數(shù)據(jù)? 這篇文章中,阿寶哥介紹了如何通過(guò)增強(qiáng)默認(rèn)的 Axios 適配器,來(lái)實(shí)現(xiàn)緩存請(qǐng)求數(shù)據(jù)的功能。同樣,采用類似的思路,我們也可以通過(guò)增強(qiáng)默認(rèn)的 Axios 適配器來(lái)實(shí)現(xiàn)請(qǐng)求重試的功能。

在介紹如何增強(qiáng)默認(rèn)適配器之前,我們先來(lái)看一下 Axios 內(nèi)置的 xhrAdapter 適配器,它被定義在 lib/adapters/xhr.js 文件中:

  1. // lib/adapters/xhr.js 
  2. module.exports = function xhrAdapter(config) { 
  3.   return new Promise(function dispatchXhrRequest(resolve, reject) { 
  4.     var requestData = config.data; 
  5.     var requestHeaders = config.headers; 
  6.  
  7.     var request = new XMLHttpRequest(); 
  8.     // 省略大部分代碼 
  9.     var fullPath = buildFullPath(config.baseURL, config.url); 
  10.     request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); 
  11.     // Set the request timeout in MS 
  12.     request.timeout = config.timeout; 
  13.  
  14.     // Listen for ready state 
  15.     request.onreadystatechange = function handleLoad() { ... } 
  16.  
  17.     // Send the request 
  18.     request.send(requestData); 
  19.   }); 
  20. }; 

很明顯 xhrAdapter 適配器是一個(gè)函數(shù)對(duì)象,它接收一個(gè) config 參數(shù)并返回一個(gè) Promise 對(duì)象。而在 xhrAdapter 適配器內(nèi)部,最終會(huì)使用 XMLHttpRequest API 來(lái)發(fā)送 HTTP 請(qǐng)求。為了實(shí)現(xiàn)請(qǐng)求重試的功能,我們就可以考慮通過(guò)高階函數(shù)來(lái)增強(qiáng) xhrAdapter適配器的功能。

2.1 定義 retryAdapterEnhancer 函數(shù)

為了讓用戶能夠更靈活地控制請(qǐng)求重試的功能,我們定義了一個(gè) retryAdapterEnhancer函數(shù),該函數(shù)支持兩個(gè)參數(shù):

  • adapter:預(yù)增強(qiáng)的 Axios 適配器對(duì)象;
  • options:緩存配置對(duì)象,該對(duì)象支持 2 個(gè)屬性,分別用于配置不同的功能:
  • times:全局設(shè)置請(qǐng)求重試的次數(shù);
  • delay:全局設(shè)置請(qǐng)求延遲的時(shí)間,單位是 ms。

了解完 retryAdapterEnhancer 函數(shù)的參數(shù)之后,我們來(lái)看一下該函數(shù)的具體實(shí)現(xiàn):

  1. function retryAdapterEnhancer(adapter, options) { 
  2.   const { times = 0, delay = 300 } = options; 
  3.  
  4.   return async (config) => { 
  5.     const { retryTimes = times, retryDelay = delay } = config; 
  6.     let __retryCount = 0; 
  7.     const request = async () => { 
  8.       try { 
  9.         return await adapter(config); 
  10.       } catch (err) { 
  11.         // 判斷是否進(jìn)行重試 
  12.         if (!retryTimes || __retryCount >= retryTimes) { 
  13.           return Promise.reject(err); 
  14.         } 
  15.         __retryCount++; // 增加重試次數(shù) 
  16.         // 延時(shí)處理 
  17.         const delay = new Promise((resolve) => { 
  18.           setTimeout(() => { 
  19.             resolve(); 
  20.           }, retryDelay); 
  21.          }); 
  22.          // 重新發(fā)起請(qǐng)求 
  23.          return delay.then(() => { 
  24.            return request(); 
  25.          }); 
  26.         } 
  27.       }; 
  28.    return request(); 
  29.   }; 

以上的代碼并不會(huì)復(fù)雜,核心的處理邏輯如下圖所示:

2.2 使用 retryAdapterEnhancer 函數(shù)

2.2.1 創(chuàng)建 Axios 對(duì)象并配置 adapter 選項(xiàng)

  1. const http = axios.create({ 
  2.   baseURL: "http://localhost:3000/"
  3.   adapter: retryAdapterEnhancer(axios.defaults.adapter, { 
  4.     retryDelay: 1000, 
  5.   }), 
  6. }); 

2.2.2 使用 http 對(duì)象發(fā)送請(qǐng)求

  1. // 請(qǐng)求失敗不重試 
  2. function requestWithoutRetry() { 
  3.   http.get("/users"); 
  4.  
  5. // 請(qǐng)求失敗重試 
  6. function requestWithRetry() { 
  7.   http.get("/users", { retryTimes: 2 }); 

好了,如何通過(guò)增強(qiáng) xhrAdapter 適配器來(lái)實(shí)現(xiàn) Axios 請(qǐng)求重試的功能已經(jīng)介紹完了。由于完整的示例代碼內(nèi)容比較多,阿寶哥就不放具體的代碼了。感興趣的小伙伴,可以訪問(wèn)以下地址瀏覽示例代碼。

  • 完整的示例代碼:
  • https://gist.github.com/semlinker/979ebc659abacea7aa6c0c44af070afe

這里我們來(lái)看一下 Axios 實(shí)現(xiàn)請(qǐng)求重試示例的運(yùn)行結(jié)果:

三、總結(jié)

本文介紹了在 Axios 中如何實(shí)現(xiàn)請(qǐng)求重試,基于文中定義的 retryAdapterEnhancer 函數(shù)或響應(yīng)攔截器,你可以輕松地?cái)U(kuò)展請(qǐng)求重試的功能。

Axios 是一個(gè)很優(yōu)秀的開源項(xiàng)目,里面有很多值得我們學(xué)習(xí)與借鑒的地方。如果你對(duì) Axios 內(nèi)部 HTTP 攔截器的設(shè)計(jì)與實(shí)現(xiàn)、HTTP 適配器的設(shè)計(jì)與實(shí)現(xiàn)及如何防御 CSRF 攻擊感興趣的話,可以閱讀 77.9K 的 Axios 項(xiàng)目有哪些值得借鑒的地方 這篇文章。

四、參考資源

  • Github - axios-extensions
  • Axios 如何取消重復(fù)請(qǐng)求?
  • Axios 如何緩存請(qǐng)求數(shù)據(jù)?
  • 77.9K 的 Axios 項(xiàng)目有哪些值得借鑒的地方

 

責(zé)任編輯:姜華 來(lái)源: 全棧修仙之路
相關(guān)推薦

2024-06-05 08:42:24

2021-04-12 05:55:29

緩存數(shù)據(jù)Axios

2021-04-06 06:01:11

AxiosWeb 項(xiàng)目開發(fā)

2021-07-27 14:50:15

axiosHTTP前端

2018-07-30 16:31:00

javascriptaxioshttp

2024-08-12 12:32:53

Axios機(jī)制網(wǎng)絡(luò)

2024-08-27 08:55:32

Axios底層網(wǎng)絡(luò)

2023-10-27 08:20:12

springboot微服務(wù)

2022-01-28 14:20:53

前端代碼中斷

2024-04-30 09:53:12

axios架構(gòu)適配器

2022-08-28 19:58:59

LinkerdKubernetes

2021-05-19 09:29:52

VueAxios異步請(qǐng)求

2025-02-04 09:58:08

2023-10-30 09:46:08

接口重試技巧

2022-06-10 13:03:44

接口重試while

2024-01-26 07:48:10

SpringKafka提升

2024-01-05 13:26:00

KafkaTopicSpring

2024-05-29 09:20:41

2022-09-15 07:31:49

Spring攔截器注解

2023-08-10 10:58:24

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 9久久| 日本又色又爽又黄又高潮 | 91精品国产高清一区二区三区 | 精品国产一区二区三区性色av | 91麻豆精品国产91久久久久久久久 | 羞羞视频免费观看入口 | 免费三级网 | 国产亚洲一级 | 五月婷婷婷 | 日本精品一区二区三区在线观看 | 色小姐综合网 | 91精品国产综合久久久久久首页 | www.黄网 | av入口 | 看a网站| 亚洲国产成人在线视频 | 欧美a在线 | 日日干天天干 | 国产精品久久久 | 免费观看的av | 91在线一区 | 操夜夜| 亚洲精品久久久一区二区三区 | 免费一区| 午夜影院在线观看视频 | 美女中文字幕视频 | 国产精品观看 | 黄色av网站在线免费观看 | 一区二区三区在线 | 操操日 | 日韩一区二区成人 | 特黄av| 国产一二三区免费视频 | 欧美午夜精品久久久久免费视 | 久久精品国产一区二区电影 | 91天堂网| 国产在线一 | 狠狠操狠狠干 | 国产成人高清在线观看 | 亚洲在线| 日本综合在线观看 |