91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

項目中如何使用axios過濾多次重復請求

發布時間:2021-07-07 17:21:16 來源:億速云 閱讀:402 作者:chen 欄目:開發技術

這篇文章主要講解了“項目中如何使用axios過濾多次重復請求”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“項目中如何使用axios過濾多次重復請求”吧!

目錄
  • 一、前言:

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

  • 二、CancelToken類

    • 最終效果


一、前言:

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

項目中如何使用axios過濾多次重復請求

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

  • 可以在請求時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過濾多次重復請求

控制臺也沒有任何報錯啦。(后續完善到項目中)

感謝各位的閱讀,以上就是“項目中如何使用axios過濾多次重復請求”的內容了,經過本文的學習后,相信大家對項目中如何使用axios過濾多次重復請求這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

西青区| 岳阳市| 梅州市| 综艺| 渑池县| 保康县| 上饶县| 临洮县| 吉木萨尔县| 铜陵市| 长海县| 安平县| 密山市| 鄂托克旗| 英吉沙县| 永丰县| 突泉县| 禄丰县| 枣强县| 蛟河市| 云南省| 共和县| 东兰县| 正安县| 湟源县| 卫辉市| 中阳县| 平果县| 丹棱县| 衡东县| 葵青区| 吴旗县| 蒙山县| 扎赉特旗| 德江县| 报价| 北安市| 平武县| 淮安市| 郁南县| 思南县|