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

淺談Axios去除重復請求方案

 更新時間:2021年08月31日 08:46:20   作者:佩子  
本文主要介紹了Axios去除重復請求方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

此方案主要有兩個功能

1.請求發(fā)出后,后續(xù)重復請求取消不處理,等待第一次請求完成。
2.路由跳轉(zhuǎn)后,上一個頁面未完成請求全部清理。

一、取消重復請求

前置知識:

1.axios官方提供的取消方法,可以查閱相關(guān)文檔:CancelToken
2.js Map相關(guān)概念
3.安全的查詢字符串解析和字符串分解庫 qs,功能類似js自帶的JSON

為簡化參數(shù)處理,本方案只考慮post請求,也就是如果method,url以及data相同則視為重復請求

// axios.js
const pending = new Map()
/**
 * 添加請求
 * @param {Object} config
 **/
const addPending = (config) => {
  const url = [
    config.method,
    config.url,
    qs.stringify(config.data)
  ].join('&')
  if (pending.has(url)) { // 如果 pending 中存在當前請求則取消后面的請求
    config.cancelToken = new axios.CancelToken(cancel => cancel(`重復的請求被主動攔截: ${url}`))
  } else { // 如果 pending 中不存在當前請求,則添加進去
    config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {
      pending.set(url, cancel)
    })
  }
}
/**
 * 移除請求
 * @param {Object} config
 */
const removePending = (config) => {
  const url = [
    config.method,
    config.url.replace(config.baseURL, ''), // 響應(yīng)url會添加域名,需要去掉與請求URL保持一致
    qs.stringify(JSON.parse(config.data)) // 需要與request的參數(shù)結(jié)構(gòu)保持一致,request中是對象,response中是字符串
  ].join('&')
  if (pending.has(url)) { // 如果在 pending 中存在當前請求標識,取消當前請求,并且移除
    pending.delete(url)
  }
}

/* axios全局請求參數(shù)設(shè)置,請求攔截器 */
axios.interceptors.request.use(
  config => {
    addPending(config) // 將當前請求添加到 pending 中
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 響應(yīng)攔截器即異常處理
axios.interceptors.response.use(
  response => {
    removePending(response.config) // 在請求結(jié)束后,移除本次請求
    return response
  },
  err => {
    if (err && err.config) {
      removePending(err.config) // 在請求結(jié)束后,移除本次請求
    }
    return Promise.resolve(err.response)
  }
)

二、清理所有請求

// axios.js
/**
 * 清空 pending 中的請求(在路由跳轉(zhuǎn)時調(diào)用)
 */
export const clearPending = () => {
  for (const [url, cancel] of pending) {
    cancel(url)
  }
  pending.clear()
}
// router.js
router.beforeEach((to, from, next) => {
  // 路由跳轉(zhuǎn),清除所有請求
  clearPending()
  })

到此這篇關(guān)于Axios去除重復請求方案的文章就介紹到這了,更多相關(guān)Axios去除重復請求方案內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析JavaScript中的Proxy對象

    淺析JavaScript中的Proxy對象

    Proxy是JavaScript的一個內(nèi)置對象,它允許您攔截并自定義對象的行為。本文將和大家簡單聊聊JavaScript中Proxy對象的創(chuàng)建與使用,感興趣的可以了解一下
    2023-03-03
  • 一個類似vbscript的round函數(shù)的javascript函數(shù)

    一個類似vbscript的round函數(shù)的javascript函數(shù)

    同vbscript的Round函數(shù)功能相同,四舍五入保留指定小數(shù)位數(shù)
    2009-04-04
  • ES6中Array.find()和findIndex()函數(shù)的用法詳解

    ES6中Array.find()和findIndex()函數(shù)的用法詳解

    ES6為Array增加了find(),findIndex函數(shù)。find()函數(shù)用來查找目標元素,找到就返回該元素,找不到返回undefined,而findIndex()函數(shù)也是查找目標元素,找到就返回元素的位置,找不到就返回-1。下面通過實例詳解,需要的朋友參考下吧
    2017-09-09
  • 淺談js之字面量、對象字面量的訪問、關(guān)鍵字in的用法

    淺談js之字面量、對象字面量的訪問、關(guān)鍵字in的用法

    下面小編就為大家?guī)硪黄獪\談js之字面量、對象字面量的訪問、關(guān)鍵字in的用法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • JS實現(xiàn)圖片高亮展示效果實例

    JS實現(xiàn)圖片高亮展示效果實例

    這篇文章主要介紹了JS實現(xiàn)圖片高亮展示效果的方法,實例分析了JavaScript響應(yīng)鼠標事件動態(tài)操作頁面元素樣式的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • JavaScript中最常見的三個面試題解析

    JavaScript中最常見的三個面試題解析

    JavaScript是所有現(xiàn)代瀏覽器的官方語言。 因此,JavaScript 問題出現(xiàn)在各種開發(fā)人員的面試中。這篇文章主要跟大家分享了關(guān)于JavaScript中最常見的三個面試題,需要的朋友可以參考學習,下面來一起看看吧。
    2017-03-03
  • JavaScript中神奇的call()方法

    JavaScript中神奇的call()方法

    這篇文章主要介紹了JavaScript中神奇的call()方法,本文用淺顯的語言幫助你加深理解call()方法,需要的朋友可以參考下
    2015-03-03
  • 微信小程序購物商城系統(tǒng)開發(fā)系列-目錄結(jié)構(gòu)介紹

    微信小程序購物商城系統(tǒng)開發(fā)系列-目錄結(jié)構(gòu)介紹

    這篇文章主要介紹了微信小程序購物商城系統(tǒng)開發(fā)系列-目錄結(jié)構(gòu)介紹,有興趣的可以了解一下。
    2016-11-11
  • JavaScript事件委托的技術(shù)原理探討示例

    JavaScript事件委托的技術(shù)原理探討示例

    使用事件委托技術(shù)能讓你避免對特定的每個節(jié)點添加事件監(jiān)聽器;相反,事件監(jiān)聽器是被添加到它們的父元素上
    2014-04-04
  • 微信小程序?qū)崿F(xiàn)水平垂直滾動

    微信小程序?qū)崿F(xiàn)水平垂直滾動

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)水平垂直滾動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03

最新評論