最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3 ts axios請求封裝,取消請求,失敗重發(fā),權(quán)限控制問題

 更新時間:2026年05月18日 10:35:37   作者:瑕疵?  
該文介紹了使用TypeScript處理前后端交互常見問題的工具,通過將token添加至請求頭、增加超時請求重試、添加請求取消功能等措施,統(tǒng)一處理網(wǎng)絡(luò)連接不穩(wěn)定、請求超時等異常情況,提高代碼質(zhì)量和維護(hù)性

vue3 ts axios請求封裝,取消請求,失敗重發(fā),權(quán)限控制

用了 TypeScript 進(jìn)行全面支持

針對前后端交互常見問題進(jìn)行了細(xì)致的處理,包括將 token 添加至請求頭、增加超時請求重試、添加請求取消功能等等。

此外,該工具還提供了統(tǒng)一的異常處理機(jī)制,對于常見的網(wǎng)絡(luò)連接不穩(wěn)定、請求超時等異常情況,能夠快速準(zhǔn)確地進(jìn)行處理。

使用該工具

可以提高代碼質(zhì)量和可維護(hù)性

import axios, { AxiosRequestConfig, CancelTokenSource } from 'axios'
import { ElMessage } from 'element-plus';
//用于報錯
import config from "@/config/projectOptions"
//項(xiàng)目整體配置
import router from "@/router";
//權(quán)限跳轉(zhuǎn)
interface AxiosRequestConfigExtended extends AxiosRequestConfig {
  retry: number
  retryDelay: number
}
axios.defaults.baseURL = config.baseUrl//url
const timeout = 5000//超時時間
let timer: number//用于延時重發(fā)請求
const request = axios.create({
  timeout,
  retry: 0, // 重試次數(shù)
  retryDelay: timeout // 重試間隔 
} as AxiosRequestConfigExtended);

request.interceptors.request.use(config => {
  config.headers && (config.headers.token = sessionStorage.getItem('token') || "")//填寫token
  timer = window.setTimeout(() => {
    config.cancelToken = axios.CancelToken.source().token//用于取消請求
  }, timeout)
  return config
  // 對響應(yīng)數(shù)據(jù)做點(diǎn)什么
}, function (error) {
  clearTimeout(timer)//錯誤后清除延時
  // 對響應(yīng)錯誤做點(diǎn)什么
  throw error
});

request.interceptors.response.use(res => {
  if (res.status === 200 && res.data.ok) {//狀態(tài)判斷
    return res.data//正常返回
  } else {
    errorHandle({ response: res })//異常集中處理
    return Promise.reject({ message: 'Unknown response format' });//報錯提示格式錯誤
  }
  // 對響應(yīng)數(shù)據(jù)做點(diǎn)什么
}, async function (error) {
  // 對響應(yīng)錯誤做點(diǎn)什么
  if (!error.config || !error.config.retry || error.response.data) {
    return errorHandle(error)
  }
  error.config.retry -= 1//記錄請求
  await new Promise((resolve) => {
    setTimeout(() => {
      resolve("");
    }, error.config.retryDelay);
  })
  //等待請求重發(fā)
  return request(error.config)
});

// 錯誤處理
function errorHandle(error: any) {
  let message = ""
  //報錯處理
  if (error.response.data) { //格式判斷
    if ([401, 403].indexOf(error.response.status) > -1) {
      // 對于未授權(quán)或權(quán)限不夠的錯誤,直接跳轉(zhuǎn)到登錄頁面
      message = '登錄過期,請重新登錄'
      setTimeout(() => {
        sessionStorage.clear()
        router.replace({ path: "Login" })
      }, 1000)
    } else if (error.response.data.code) {
      if ([522, 523].indexOf(error.response.data.code) > -1) {
        // 對于未授權(quán)或權(quán)限不夠的錯誤,直接跳轉(zhuǎn)到登錄頁面
        message = error.response.data.message
        setTimeout(() => {
          sessionStorage.clear()
          router.replace({ path: "Login" })
        }, 1000)
      } else {
        message = message = error.response.data.message
      }
    } else if (error.message === "Network Error") {
      message = "網(wǎng)絡(luò)連接已斷開,請檢查網(wǎng)絡(luò)"
    } else if (error.message === `timeout of ${timeout}ms exceeded`) {
      message = "請求超時,請檢查網(wǎng)絡(luò)"
    } else if (error.message.indexOf('timeout') > -1) {
      message = "服務(wù)器響應(yīng)超時,請重試"
    } else {
      message = error.message
    }
  } else {
    message = "請求失敗,請稍后重試"
  }
  ElMessage.error(message)
  return Promise.reject(error);
}

export default {
//導(dǎo)出get方法 傳入cancel用于取消請求
  get: (url: string, params?: any, cancel?: CancelTokenSource) => request.get(url, {
    params,
    cancelToken: cancel ? cancel.token : undefined
  }),
  //用于post傳入數(shù)據(jù)識別params||body
  post: (url: string, data?: { params?: any, data?: any }, cancel?: CancelTokenSource) => request.post(url, data?.data, {
    params: data?.params,
    cancelToken: cancel ? cancel.token : undefined
  }),
  //導(dǎo)出刪除
  delete: (url: string, params?: any, cancel?: CancelTokenSource) => request.delete(url, {
    params,
    cancelToken: cancel ? cancel.token : undefined
  })
  //可自行增加
}

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue實(shí)現(xiàn)導(dǎo)航欄效果(選中狀態(tài)刷新不消失)

    vue實(shí)現(xiàn)導(dǎo)航欄效果(選中狀態(tài)刷新不消失)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)導(dǎo)航欄效果,選中狀態(tài)刷新不消失,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Vue3 狀態(tài)管理 Pinia 入門指南

    Vue3 狀態(tài)管理 Pinia 入門指南

    Pinia 是 Vue 3 官方推薦的狀態(tài)管理庫,相較于 Vuex 更加輕量、易于使用,下面就來詳細(xì)的介紹一下Vue3 狀態(tài)管理 Pinia 入門,感興趣的可以了解一下
    2026-05-05
  • 詳解Vue單元測試case寫法

    詳解Vue單元測試case寫法

    這篇文章主要介紹了詳解Vue單元測試case寫法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • vue靜態(tài)界面之左二級菜單右表單表格的實(shí)例代碼

    vue靜態(tài)界面之左二級菜單右表單表格的實(shí)例代碼

    這篇文章主要介紹了vue靜態(tài)界面之左二級菜單右表單表格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 在Vue項(xiàng)目中修改啟動后的Logo和項(xiàng)目名稱的方法

    在Vue項(xiàng)目中修改啟動后的Logo和項(xiàng)目名稱的方法

    在Vue項(xiàng)目開發(fā)中,我們經(jīng)常需要根據(jù)項(xiàng)目需求修改默認(rèn)的品牌標(biāo)識,無論是企業(yè)級管理系統(tǒng)還是個人項(xiàng)目,定制化的Logo和名稱都能讓項(xiàng)目更具辨識度,本文將詳細(xì)介紹如何在Vue項(xiàng)目中修改啟動后的Logo和項(xiàng)目名稱,需要的朋友可以參考下
    2026-03-03
  • Nginx同一端口部署多個前后端分離的vue項(xiàng)目完整步驟

    Nginx同一端口部署多個前后端分離的vue項(xiàng)目完整步驟

    最近做項(xiàng)目結(jié)構(gòu)優(yōu)化,前端項(xiàng)目都是部署在nginx上,想實(shí)現(xiàn)同一個端口可以訪問多個前端項(xiàng)目,所以就有了本文,這篇文章主要給大家介紹了關(guān)于Nginx同一端口部署多個前后端分離的vue項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • webpack+vue+express(hot)熱啟動調(diào)試簡單配置方法

    webpack+vue+express(hot)熱啟動調(diào)試簡單配置方法

    今天小編就為大家分享一篇webpack+vue + express (hot) 熱啟動調(diào)試簡單配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決

    vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決

    這篇文章主要介紹了vue-cli3項(xiàng)目在IE瀏覽器打開兼容問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解VUE 定義全局變量的幾種實(shí)現(xiàn)方式

    詳解VUE 定義全局變量的幾種實(shí)現(xiàn)方式

    本篇文章主要介紹了VUE 全局變量的幾種實(shí)現(xiàn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Vue全局注冊與局部注冊兩種組件注冊的方式

    Vue全局注冊與局部注冊兩種組件注冊的方式

    本文主要介紹了Vue全局注冊與局部注冊兩種組件注冊的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

丰镇市| 策勒县| 梨树县| 合阳县| 镇平县| 三门县| 郑州市| 江川县| 杂多县| 郧西县| 焦作市| 屏东县| 丹巴县| 额尔古纳市| 福建省| 绥江县| 陵水| 当雄县| 宕昌县| 惠来县| 宜阳县| 卓资县| 濮阳市| 花垣县| 鸡泽县| 沂水县| 林西县| 盱眙县| 盱眙县| 长治市| 内丘县| 泗洪县| 广南县| 连平县| 邓州市| 南汇区| 霍林郭勒市| 常山县| 东乌珠穆沁旗| 龙江县| 长阳|