中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用axios過濾多次重復請求

發布時間:2022-10-21 17:34:09 來源:億速云 閱讀:292 作者:iii 欄目:開發技術

本篇內容主要講解“怎么使用axios過濾多次重復請求”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用axios過濾多次重復請求”吧!

    一、前言:

    我們在web應用開發過程當中,經常會遇到一個時刻發起了多個請求的場景

    這個情況下,我們通常的做法有兩種:

    • 可以在請求時show一個loading,阻止用戶操作。

    • 或者人為加個變量,做一個請求的節流

    我們的項目中,目前大部分情況也是采用以上兩種方式做的。今天來介紹一個新的方式。

    二、CancelToken類

    我們之前實例化一個Promise,這個對象是否成功與否,是無法在函數外部決定的,這里邊使用要用到一個小竅門,可以讓一個promise 和resolve分離。任何時機都可以觸發resolve:

      // 一個promise
      let resolvePromise
      let p = new Promise((resolve, reject) => {
        resolvePromise = resolve
      })
      // 這樣在外部執行
      resolvePromise()

    ok,有了這個前提,我們需要借助axios.CancelToken這個類。

    這個類相當于在每次請求的時候開啟另一個promise和當前的請求形成一個promise.race(請求p1,取消請求p2),在promise中的resolve方法賦值給了一個外部的變量去接收。我們可以根據需求,人為決定是否取消前次請求。其實這就類似,原來我們寫fetch封裝接口超時的Promise.race類似。

    cancelToken中也提供了相應的static方法source用來生成一個cancelToken和一個cancel方法其實就是這個promise的一個resolve。

    CancelToken.source = function source() {
        var cancel;
        // 
        var token = new CancelToken(function executor(c) {
            cancel = c;
        });
        return {
            token: token,
            cancel: cancel,
        };

    根據我們常用的的緩存方式,我們可以聲明一個map來存儲每次請求的url,同時存儲對應的cancel方法。

    // 聲明一個全局map
        const pendingHttp = new Map()
        // axios中內置的CancelToken類
        const CancelToken = axios.CancelToken
           
        function addApi (config) {
          config.cancelToken = new CancelToken((cancel) => {
            const url = config.url
            console.log(pendingHttp)
            if (!pendingHttp.has(url)) {
              pendingHttp.set(url, cancel)
            }
          })
        }
    
        function cancelApi (config) {
          const url = config.url
          if (pendingHttp.has(url)) { // 如果在 pending 中存在當前請求標識,需要取消當前請求,并且移除
            const cancel = pendingHttp.get(url)
            cancel(url + '取消了')
            pendingHttp.delete(url) // 清空當前url的緩存
          }
        }
    • 要特殊注意,要想取消掉一個請求,需要在config上添加cancelToken這個屬性賦值為CancelToken的實例。否則cancel不掉。

    就像操作定時器一樣,要先嘗試取消上一次,然后再開啟下一次

    httpService.interceptors.request.use(config => {
    
          cancelApi(config)
          addApi(config)
          
          // 本地調試的時候,是跨域的情況,加請求頭會有限制(此處是項目代碼無關緊要)
          const { headers = {} } = config; const { globalObj = {} } = window
          Object.assign(headers, globalObj, { from })
          
          return config
        }, error => {
          console.log(error)
          return Promise.reject(error)
        })

    然后還有一種可能性,第一次請求已經返回了,又發起了相同的一次請求,所以在response里邊也要cancelApi一下。

    httpService.interceptors.response.use(
          response => {
            cancelApi(response.config)
            sentryCatchApi(response)
          },
          error => {
            // 請求超時
            if (error.message.includes('timeout')) { // 判斷請求異常信息中是否含有超時timeout字符串
              Toast.error({ text: '網頁請求超時,請刷新重試~' })
            }
            sentryCatchApi(error)
            return Promise.reject(error)
          }
        )

    我們需要注意一點,cancel其實就是resolve,我們cancel執行時候傳入的參數,會最終在response的error回調中,作為參數返回,這樣我們的捕捉錯誤的方法可能會有報錯。

    // 假設我們的error方法是這樣封裝的。 來看一下sentryCatchApi
        error => {
          sentryCatchApi(error)
          return Promise.reject(error)
        }
      // 由于這個方法需要接收一個對象,但是我們cancel取消請求的情況下,返回的是一個字符串,這時就報錯了。
      function sentryCatchApi (res) {
          try {
            res = res || {}
            const resData = res.data || {}
            Sentry.captureException(JSON.stringify(resData))
            console.log(`
              獲取數據失敗:
              請在瀏覽器中打開進入 webview的地址,并粘貼出來,便于問題排查
              :接口相關信息:
              接口地址:${res.config.url},
              接口返回值:code:${resData.code},
              message:${resData.message},
              data:${JSON.stringify(resData.data)}
            `)
          } catch (err) {
            console.error(err)
          }
        }

    需要使用isCancel這個api

       error => {
        if (axios.isCancel(error)) return console.log('請求被取消了', error.message)
        sentryCatchApi(error)
        return Promise.reject(error)
      }

    到此,相信大家對“怎么使用axios過濾多次重復請求”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    宜宾县| 道真| 上林县| 筠连县| 山丹县| 古蔺县| 大竹县| 仙居县| 道真| 福安市| 曲松县| 龙海市| 长顺县| 崇明县| 获嘉县| 丹寨县| 榆中县| 荥阳市| 罗定市| 姚安县| 阜城县| 牡丹江市| 望谟县| 水城县| 伊吾县| 育儿| 桃园县| 台东县| 泸水县| 蒙阴县| 望奎县| 加查县| 吉安市| 金平| 剑阁县| 瑞安市| 平凉市| 龙游县| 嘉黎县| 曲沃县| 施秉县|