国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

axios 實(shí)現(xiàn)請求重試

這篇具有很好參考價值的文章主要介紹了axios 實(shí)現(xiàn)請求重試。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

axios 實(shí)現(xiàn)請求重試,Axios,axios,請求重試,JavaScript,前端,typescript

前景提要:
ts 簡易封裝 axios,統(tǒng)一 API
實(shí)現(xiàn)在 config 中配置開關(guān)攔截器

請求重試的核心是可以重放請求,具體實(shí)現(xiàn)就是在 axios 中,拿到當(dāng)前請求的 config 對象,再用 axios 實(shí)例,就能重放請求。

在無感刷新 token 中,當(dāng) access token 過期,使用 refresh token 刷新后,就需要再次對業(yè)務(wù)接口重放請求。

上面是一種請求重試的場景,一般情況下也不需要重試,所以我們這里講的請求重試,指的都是請求網(wǎng)絡(luò)錯誤的情況下需要重試。
比如斷網(wǎng)了,然后重試。而不是因?yàn)榻涌诜祷?code 如 401 就重試。因?yàn)榻涌诜祷?401,從網(wǎng)絡(luò)層面上講,這是沒有失敗的,http 狀態(tài)碼是 200,返回 401 只是業(yè)務(wù)失敗。
比起斷網(wǎng),更常見的網(wǎng)絡(luò)錯誤下需要重試的是請求超時。

通過錯誤攔截器實(shí)現(xiàn)請求重試。整個請求過程是一個遞歸。

第一次請求失敗,觸發(fā)全局錯誤攔截,然后一路拋出錯誤,觸發(fā)到重試的錯誤攔截器。判斷還有重試次數(shù)后,拿到同一個實(shí)例重放請求。注意此時第一次請求并未結(jié)束,this.instance.request 方法依舊在等待結(jié)果。
如果請求依舊失敗,則觸發(fā)第二次請求的全局錯誤攔截,最后再次觸發(fā)重試。如果第二次請求重試成功了,此時就拿到了請求結(jié)果。并且為了讓結(jié)果最終被第一次請求捕獲,需要在錯誤攔截器中拋出 fulfilled 狀態(tài)的 promise 攜帶結(jié)果。
當(dāng)請求次數(shù)用完,則錯誤攔截器繼續(xù)拋出錯誤對象,觸發(fā)第一次請求的 request 方法的 catch 代碼塊。宣告整個請求失敗。

注意:

  • 一定要以同一個 axios 實(shí)例重新發(fā)起請求,因?yàn)楸举|(zhì)是遞歸,換個一個實(shí)例就拿不到重試成功后的請求結(jié)果了。
  • 并且還需要在這個重試的錯誤攔截器中返回一個 fulfilled 狀態(tài)的 promise,讓第一次請求的實(shí)例方法捕獲。

return Promise.resolve(res); 或 Promise.rejected(234); 都表示返回一個確定了狀態(tài)的 promise,然后這個 promise 中攜帶了數(shù)據(jù)(就是參數(shù))。文章來源地址http://www.zghlxwxcb.cn/news/detail-743010.html

import httpRequest from "..";
import { MyAxiosError, MyAxiosRequestConfig } from "./request";

const MAX_RETRY_COUNT = 3;
const DELAY_TIME = 2000;

let currentCount = 1;
/**
 * 請求重試
 * @param err 錯誤對象
 * @returns 重試機(jī)會用完拋出錯誤,重試成功則返回請求結(jié)果
 */
export async function retryRequest(err: MyAxiosError) {
    if (err.config.retry === false) throw err;
    if (err.message === "canceled") throw err; // 過濾手動取消請求的情況

    const config = err.config as MyAxiosRequestConfig;

    if (MAX_RETRY_COUNT >= currentCount && config) {
        console.log(`重試${currentCount}次...`);
        currentCount++;
        await sleep(DELAY_TIME);
        const res = await httpRequest.getInstance().request({ ...config });
        return Promise.resolve(res);
    }
    console.log("重試次數(shù)已用完...");
    currentCount = 0;
    throw err;
}

/**
 * 延遲后續(xù)代碼執(zhí)行的工具函數(shù),以同步代碼阻塞的方式實(shí)現(xiàn)延遲:await sleep()
 * @param delayTime 延遲時間
 * @returns Promise
 */
export function sleep(delayTime: number = 1000) {
    return new Promise(resolve => setTimeout(resolve, delayTime));
}

到了這里,關(guān)于axios 實(shí)現(xiàn)請求重試的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue2/3 axios 請求重試、取消請求、loading 串行并行等(分享)

    基礎(chǔ)版,添加 loading 在請求響應(yīng)攔截器里面添加 loading,這樣就不需要給每一個請求添加 loading 了 這些代碼都是 vue2 項(xiàng)目的,vue3 也通用,改一下 loading 和 message 就好了(主要是 element 的區(qū)別) 我這里最后沒有合并代碼,有的配置不適合寫在一起,看自己項(xiàng)目的需要 響應(yīng)狀態(tài)

    2024年02月10日
    瀏覽(24)
  • 【前端知識】Axios——請求攔截器模板

    Axios是一個基于Promise的HTTP客戶端,用于發(fā)送HTTP請求。它可以在瀏覽器和Node.js環(huán)境中使用,并且提供了許多強(qiáng)大的功能,例如攔截請求和響應(yīng)、轉(zhuǎn)換請求和響應(yīng)數(shù)據(jù)、取消請求等。 Axios具有簡單易用的API,可以輕松地發(fā)送GET、POST、PUT、DELETE等各種類型的請求。它還支持異步操

    2024年02月09日
    瀏覽(60)
  • 前端開發(fā)中的ajax請求、axios封裝

    前端開發(fā)中的ajax請求、axios封裝

    目錄 瀏覽器http請求 同步?js標(biāo)簽跨域、url 異步ajax、websock協(xié)議 ajax是異步的技術(shù)術(shù)語,最早的api是xhr(XMLHttpRequest) fetch es6 api axios 封裝axios(無論用requst還是axios請求都會生效) src/utils/request.ts請求/響應(yīng)攔截器封裝 ts post請求request.post(url)和 通用請求request({url,method:\\\'post\\\'})對象

    2024年02月11日
    瀏覽(70)
  • 前端如何中斷請求 ( axios、原生 ajax、fetch)

    使用場景 在前端開發(fā)中,我們經(jīng)常需要中斷請求來優(yōu)化性能或處理特定的業(yè)務(wù)需求。以下是一些常見的使用場景: 比如 重復(fù)請求:當(dāng)頁面中多個組件并發(fā)調(diào)用同一個接口時,在第一個請求返回后,我們可能需要中斷其他組件對該接口的調(diào)用,以避免重復(fù)請求和冗余數(shù)據(jù)。這

    2024年02月04日
    瀏覽(43)
  • 前端 axios 通過 get 請求發(fā)送 json 數(shù)據(jù)

    前端 axios 通過 get 請求發(fā)送 json 數(shù)據(jù)

    先說結(jié)論: axios 不能通過 get 請求發(fā)送 json 數(shù)據(jù) 使用 postman 可以做到通過 get 請求發(fā)送 json 數(shù)據(jù) 但是通過?axios 框架就不行, 主要是因?yàn)閍xios是對ajax的一個封裝。他本身不支持get請求在body體傳參。 原生和jquery的ajax是支持的。建議跟后端溝通,你把json拼在url后面,后端從url的

    2024年02月11日
    瀏覽(26)
  • 前端終止請求的三種方式(ajax、axios)

    前端終止請求的三種方式(ajax、axios)

    一、原生ajax終止請求 1、abort() ? XMLHttpRequest.abort() 方法用于終止 XMLHttpRequest 對象的請求,該方法沒有參數(shù),也沒有返回值。當(dāng)調(diào)用該方法時,如果對應(yīng) XMLHttpRequest 對象的請求已經(jīng)被發(fā)送并且正在處理中,則會中止該請求;如果請求已經(jīng)完成(即已經(jīng)接收到完整的響應(yīng)),則

    2024年02月09日
    瀏覽(29)
  • 前端vue2中axios封裝請求數(shù)據(jù),教會你封裝教會你請求數(shù)據(jù) 簡單易懂,輕松學(xué)會axios封裝請求數(shù)據(jù) 看一眼就會 手把手教會

    2、完成上面的步驟還不夠,還需要再創(chuàng)建一個文件夾api,然后在文件夾里面創(chuàng)建自定義的文件名(我創(chuàng)建的是cartApi.js)文件名根據(jù)自己的需求命名 下面就是根據(jù)自己的請求接口以及數(shù)據(jù)參數(shù)請求,下面的請求是一些常見的post、get請求以及傳參啥的(僅供參考,可以參考下面

    2024年02月03日
    瀏覽(98)
  • 前端基于axios請求下載文件(后端返回Blob文件流)

    前端基于axios請求下載文件(后端返回Blob文件流)

    前端小白第一篇csdn文章就當(dāng)自己記錄學(xué)習(xí)啦! 我自己遇到的情況寫在前面防止有人和我不一樣,浪費(fèi)時間瀏覽; 調(diào)用下載接口后端給我返回的數(shù)據(jù)格式(即文件流格式)如下: 1.按鈕定義點(diǎn)擊事件 2.調(diào)用后端接口 在使用 axios 請求下載文件 api 接口時,注意區(qū)分不同請求方法

    2024年02月11日
    瀏覽(97)
  • 前端請求數(shù)據(jù)方法 —— Ajax、Fetch、Axios、Get、Post

    Ajax :( “Asynchronous JavaScript and XML”(異步JavaScript和XML)的縮寫)是一組Web開發(fā)技術(shù),Ajax不是一種技術(shù),而是一個編程概念。AJAX 這個詞就成為 JavaScript 腳本發(fā)起 HTTP 通信的代名詞,也就是說,只要用腳本發(fā)起通信,就可以叫做 AJAX 通信。 技術(shù)實(shí)現(xiàn) 用于演示的HTML(或 XHTML)和

    2024年01月22日
    瀏覽(29)
  • Axios基本使用,為學(xué)習(xí)后續(xù)的Vue服務(wù)【發(fā)送請求+并發(fā)請求+前端攔截器】

    目錄 1、項(xiàng)目中引入Axios 2、使用Axios發(fā)送請求 2.1、例:發(fā)送GET請求 2.2、例:發(fā)送POST請求 3、axios并發(fā)請求 4、攔截器 注:個人學(xué)習(xí)筆記,因自己學(xué)過后端,所以有關(guān)后端的代碼,我在這里就不展示了~ 不了解后端的寶子,也不會耽誤學(xué)習(xí),因?yàn)楣纠飼袑懞玫慕涌谖臋n,直

    2024年02月02日
    瀏覽(56)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包