欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue路由切換和Axios接口取消重復請求詳解

 更新時間:2022年05月06日 12:09:38   作者:南城大前端  
在web項目開發(fā)的過程中,經(jīng)常會遇到客服端重復發(fā)送請求的場景,下面這篇文章主要給大家介紹了關于Vue路由切換和Axios接口取消重復請求的相關資料,需要的朋友可以參考下

前言

在日常前端開發(fā)中, 經(jīng)常會遇到頻繁發(fā)起的重復請求, 會給服務器及網(wǎng)絡造成不必要的壓力, 可通過取消重復請求解決

場景

  • 訂單數(shù)據(jù)條件篩選查詢
  • 表單提交按鈕頻繁點擊
  • 路由頁面切換請求未取消

解決方案

在每個請求發(fā)起的時候存儲當前存儲的標記在一個數(shù)組或Map中, 針對每個請求的時候在請求攔截中查詢是否重復, 如果已重復則取消歷史中重復的請求, 再發(fā)起當前請求, 如果沒有重復, 則添加存儲標記并正常請求, 已請求完成的清除存儲標記

axios中如何取消請求

  • 可以使用 CancelToken.source 工廠方法創(chuàng)建 cancel token,像這樣:
const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
     // 處理錯誤
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消請求(message 參數(shù)是可選的)
source.cancel('Operation canceled by the user.');
  • 還可以通過傳遞一個 executor 函數(shù)到 CancelToken 的構造函數(shù)來創(chuàng)建 cancel token:
const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函數(shù)接收一個 cancel 函數(shù)作為參數(shù)
    cancel = c;
  })
});

// cancel the request
cancel();

項目中封裝使用

基本變量定義

// 是否取消重復請求開關
const cancelDuplicated = true

// 存儲每個請求中的map
const pendingXHRMap = new Map()

// 取消請求類型定義 便于后期對此類型不做異常處理
const REQUEST_TYPE = {
  DUPLICATED_REQUEST: 'duplicatedRequest'
}

設置重復標記的函數(shù)

const duplicatedKeyFn = (config) => {
  // 可在此設置用戶自定義其他唯一標識 默認按請求方式 + 請求地址
  return `${config.method}${config.url}`
}

添加到請求記錄

const addPendingXHR = (config) => {
  if (!cancelDuplicated) {
    return
  }
  const duplicatedKey = JSON.stringify({
    duplicatedKey: duplicatedKeyFn(config),
    type: REQUEST_TYPE.DUPLICATED_REQUEST
  })
  config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
    if (duplicatedKey && !pendingXHRMap.has(duplicatedKey)) {
      pendingXHRMap.set(duplicatedKey, cancel)
    }
  })
}

刪除請求記錄

const removePendingXHR = (config) => {
  if (!cancelDuplicated) {
    return
  }
  const duplicatedKey = JSON.stringify({
    duplicatedKey: duplicatedKeyFn(config),
    type: REQUEST_TYPE.DUPLICATED_REQUEST
  })
  if (duplicatedKey && pendingXHRMap.has(duplicatedKey)) {
    const cancel = pendingXHRMap.get(duplicatedKey)
    cancel(duplicatedKey)
    pendingXHRMap.delete(duplicatedKey)
  }
}

axios中使用

// 請求攔截處理
axios.interceptors.request.use(config => {
    removePendingXHR(config)
    addPendingXHR(config)
    ...
    return config
})

// 響應攔截處理
axios.interceptors.response.use(response => {
    removePendingXHR(response.config)
    ...
}, error => {
    // 如果是取消請求類型則忽略異常處理
    let isDuplicatedType;
    try {
      const errorType = (JSON.parse(error.message) || {}).type
      isDuplicatedType = errorType === REQUEST_TYPE.DUPLICATED_REQUEST;
    } catch (error) {
      isDuplicatedType = false
    }
    if (!isDuplicatedType) {
        // 其他異常處理
    }
})

Vue中當路由切換頁面的時候,將上一個頁面的所有請求取消

router.beforeEach((to, from, next) => {
    // 遍歷pendingMap,將上一個頁面的所有請求cancel掉
    pendingXHRMap.forEach((cancel) => {
        cancel();
    });
    pendingXHRMap.clear()
})

總結

本文主要介紹了在日常前端開發(fā)中, 遇到各種情況下頻繁發(fā)起的重復請求, 會給服務器及網(wǎng)絡造成不必要的壓力, 可通過取消重復請求解決。

到此這篇關于Vue路由切換和Axios接口取消重復請求的文章就介紹到這了,更多相關Vue Axios接口重復請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

參考

axios官網(wǎng)取消請求

如何優(yōu)雅的解決”重復請求“問題

相關文章

  • vue使用keep-alive保持滾動條位置的實現(xiàn)方法

    vue使用keep-alive保持滾動條位置的實現(xiàn)方法

    這篇文章主要介紹了vue使用keep-alive保持滾動條位置的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 淺談Vue的響應式原理

    淺談Vue的響應式原理

    讓我們來回顧下Vue的介紹,可以發(fā)現(xiàn)Vue 最顯著的一個功能是響應系統(tǒng)。那么它的實現(xiàn)原理有又是如何呢?下面小編和大家來一起學習一下
    2019-05-05
  • Vue2.0用戶權限控制解決方案

    Vue2.0用戶權限控制解決方案

    這篇文章主要介紹了Vue2.0用戶權限控制解決方法以及源碼說明,一起學習下。
    2017-11-11
  • mpvue構建小程序的方法(步驟+地址)

    mpvue構建小程序的方法(步驟+地址)

    mpvue是一個使用Vue.js開發(fā)小程序的前端框架??蚣芑?Vue.js 核心,這篇文章主要介紹了mpvue構建小程序的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 為什么要使用Vuex的介紹

    為什么要使用Vuex的介紹

    今天小編就為大家分享一篇關于為什么要使用Vuex的介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • VUE+element開發(fā)后臺管理的搜索功能

    VUE+element開發(fā)后臺管理的搜索功能

    這篇文章主要為大家詳細介紹了VUE+element開發(fā)后臺管理的搜索功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 在Vue中實現(xiàn)二維碼生成與掃描功能的方法

    在Vue中實現(xiàn)二維碼生成與掃描功能的方法

    二維碼是一種廣泛應用于各種場合的編碼方式,它可以將信息編碼成一張二維圖案,方便快捷地傳遞信息,在Vue.js中,我們可以使用一些庫和組件來實現(xiàn)二維碼的生成和掃描,本文將介紹如何在Vue中實現(xiàn)二維碼的生成和掃描的方法
    2023-06-06
  • vue項目的屏幕自適應多個方案總結

    vue項目的屏幕自適應多個方案總結

    最近在用VUE寫大屏頁面,遇到屏幕自適應問題,下面這篇文章主要給大家介紹了關于vue項目的屏幕自適應多個方案的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • vue中的stylus及stylus-loader版本問題

    vue中的stylus及stylus-loader版本問題

    這篇文章主要介紹了vue中的stylus及stylus-loader版本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue-cli 使用json server在本地模擬請求數(shù)據(jù)的示例代碼

    Vue-cli 使用json server在本地模擬請求數(shù)據(jù)的示例代碼

    本篇文章主要介紹了Vue-cli 使用json server在本地模擬請求數(shù)據(jù)的示例代碼,非常具有實用價值,需要的朋友可以參考下
    2017-11-11

最新評論