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

淺談axios中取消請求及阻止重復請求的方法

 更新時間:2022年02月15日 10:06:31   作者:harsima  
在實際項目中,我們可能需要對請求進行“防抖”處理。本文主要實現(xiàn)axios中取消請求及阻止重復請求,具有一定的參考價值,感興趣的可以了解一下

前言

在實際項目中,我們可能需要對請求進行“防抖”處理。這里主要是為了阻止用戶在某些情況下短時間內(nèi)重復點擊某個按鈕,導致前端向后端重復發(fā)送多次請求。這里我列舉兩種比較常見的實際情況:

  • PC端 - 用戶雙擊搜索按鈕,可能會觸發(fā)兩次搜索請求
  • 移動端 - 因移動端沒有點擊延遲,所以極易造成誤操作或多操作,造成請求重發(fā)

以上情況有可能在有Loading遮罩時依然發(fā)生,所以我們要考慮前端阻止重復請求的方法。

核心——CancelToken

在Axios中取消請求最核心的方法是CanelToken。在官網(wǎng)文檔中有寫到兩種方法使用CancelToken,這里簡單粘貼出來,并增加了注釋

方法1:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  // 必須對請求進行cancelToken設置
  cancelToken: source.token
}).catch(function (thrown) {
  // 如果請求被取消則進入該方法判斷
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

// 取消上面的請求
// source.cancel('messge') message為可選項,必須為String
source.cancel('Operation canceled by the user.');

方法2:

const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  // 在options中直接創(chuàng)建一個cancelToken對象
  cancelToken: new CancelToken(function executor(c) {
    cancel = c;
  })
});

// 取消上面的請求
cancel();

實際應用和封裝

上文已對axios中的核心方法進行了舉例,但是在實際中我們往往不會像官網(wǎng)例子中那樣使用,更多的是在axios的攔截器中做全局配置管理。這樣的話我們需要對上面的代碼進行一些改變。

這里說一下我實現(xiàn)的大體思路:

  • 我們需要對所有正在進行中的請求進行緩存。在請求發(fā)起前判斷緩存列表中該請求是否正在進行,如果有則取消本次請求。
  • 在任意請求完成后,需要在緩存列表中刪除該次請求,以便可以重新發(fā)送該請求

思路說完,我們直接上代碼

// 正在進行中的請求列表
let reqList = []

/**
 * 阻止重復請求
 * @param {array} reqList - 請求緩存列表
 * @param {string} url - 當前請求地址
 * @param {function} cancel - 請求中斷函數(shù)
 * @param {string} errorMessage - 請求中斷時需要顯示的錯誤信息
 */
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
  const errorMsg = errorMessage || ''
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}

/**
 * 允許某個請求可以繼續(xù)進行
 * @param {array} reqList 全部請求列表
 * @param {string} url 請求地址
 */
const allowRequest = function (reqList, url) {
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      reqList.splice(i, 1)
      break
    }
  }
}

const service = axios.create()

// 請求攔截器
service.interceptors.request.use(
  config => {
 let cancel
   // 設置cancelToken對象
    config.cancelToken = new axios.CancelToken(function(c) {
     cancel = c
    })
    // 阻止重復請求。當上個請求未完成時,相同的請求不會進行
    stopRepeatRequest(reqList, config.url, cancel, `${config.url} 請求被中斷`)
    return config
  },
  err => Promise.reject(err)
)

// 響應攔截器
service.interceptors.response.use(
  response => {
    // 增加延遲,相同請求不得在短時間內(nèi)重復發(fā)送
    setTimeout(() => {
      allowRequest(reqList, response.config.url)
    }, 1000)
    // ...請求成功后的后續(xù)操作
    // successHandler(response)
  },
  error => {
    if (axios.isCancel(thrown)) {
      console.log(thrown.message);
    } else {
      // 增加延遲,相同請求不得在短時間內(nèi)重復發(fā)送
      setTimeout(() => {
        allowRequest(reqList, error.config.url)
      }, 1000)
    }
    // ...請求失敗后的后續(xù)操作
    // errorHandler(error)
  }
)

一些小細節(jié)

為什么沒用前文方法2中的代碼進行cancelToken設置?
axios的文檔中有一條備注:

Note: you can cancel several requests with the same cancel token.
你可以使用相同的Token來取消多個請求

所以我不想在每個請求前都new一個新的對象
請務必使用方法2,保證每次cancel都能正確執(zhí)行。之前方法會導致當出現(xiàn)cancel后,后續(xù)請求也會持續(xù)cancel

為什么在response中需要增加延遲?
因為不想讓用戶在極短的時間內(nèi)重復進行相同請求。
請注意,在response中阻止請求和在request中的阻止請求是兩個概念:
request中是阻止上個請求 未完成 時又開始了相同的請求
response中是阻止上個請求 完成后 一段時間內(nèi)不允許相同請求

我能否在cancel時傳遞一個對象,而不僅僅是message?
以官方提供的接口來看是不可以的,你可以仿照官方源碼進行重新封裝,或者使用第三方插件,或者使用另一個方法:將對象轉(zhuǎn)換為JSON字符串,然后在需要的地方再轉(zhuǎn)換回來

到此這篇關(guān)于淺談axios中取消請求及阻止重復請求的方法的文章就介紹到這了,更多相關(guān)axios中取消請求及阻止重復請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Element Alert警告的具體使用方法

    Element Alert警告的具體使用方法

    這篇文章主要介紹了Element Alert警告的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Vue+java實現(xiàn)時間段的搜索示例

    Vue+java實現(xiàn)時間段的搜索示例

    本文主要介紹了Vue+java實現(xiàn)時間段的搜索示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 詳解lottie動畫在vue中的應用

    詳解lottie動畫在vue中的應用

    Lottie 是一個適用于 Android、iOS、Web 和 Windows 的庫,它使用 Bodymovin 解析導出為 JSON 的 Adobe After Effects 動畫,下面我們就來看看它在vue中的是如何應用的吧
    2023-12-12
  • vue項目中安裝less依賴的過程

    vue項目中安裝less依賴的過程

    這篇文章主要介紹了vue項目中安裝less依賴的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue3中實現(xiàn)代碼高亮的兩種方法(prismjs和highlight.js)

    Vue3中實現(xiàn)代碼高亮的兩種方法(prismjs和highlight.js)

    最近忙著開發(fā)自己的博客系統(tǒng),在做界面展示的時候,需要讓代碼高亮,于是經(jīng)過在網(wǎng)上查閱,發(fā)現(xiàn)有兩款比較好用的插件實現(xiàn)代碼高亮,分別是prismjs和highlight.js,下面我分別介紹下,方便給需要的同學參考
    2025-04-04
  • ElementUI中<el-form>標簽中ref、:model、:rules的作用淺析

    ElementUI中<el-form>標簽中ref、:model、:rules的作用淺析

    Element官方文檔中寫到,model是表單數(shù)據(jù)對象,rules是表單驗證規(guī)則,下面這篇文章主要給大家介紹了關(guān)于ElementUI中<el-form>標簽中ref、:model、:rules作用的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Vue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下
    2021-03-03
  • Vue項目中如何安裝element組件

    Vue項目中如何安裝element組件

    這篇文章主要介紹了Vue項目中如何安裝element組件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Vue關(guān)于對象直接賦值的坑及解決

    Vue關(guān)于對象直接賦值的坑及解決

    這篇文章主要介紹了Vue關(guān)于對象直接賦值的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • swiper在vue項目中l(wèi)oop循環(huán)輪播失效的解決方法

    swiper在vue項目中l(wèi)oop循環(huán)輪播失效的解決方法

    今天小編就為大家分享一篇swiper在vue項目中l(wèi)oop循環(huán)輪播失效的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論

洛浦县| 贵南县| 临清市| 无棣县| 碌曲县| 贺州市| 星子县| 贡嘎县| 信阳市| 长寿区| 北京市| 潮安县| 云梦县| 屏边| 左云县| 库车县| 古田县| 邳州市| 五常市| 逊克县| 广昌县| 肥城市| 新余市| 乌苏市| 安泽县| 桂阳县| 新宁县| 京山县| 南和县| 南宁市| 隆林| 周至县| 通海县| 宜兰市| 金阳县| 江山市| 枣阳市| 承德县| 南安市| 漠河县| 乐亭县|