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

vue axios攔截器常用之重復(fù)請(qǐng)求取消

 更新時(shí)間:2021年09月08日 10:43:13   作者:小撕夜  
我們大家在開(kāi)發(fā)中,經(jīng)常會(huì)遇到接口重復(fù)請(qǐng)求導(dǎo)致的各種問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于axios攔截器之重復(fù)請(qǐng)求取消的相關(guān)資料,需要的朋友可以參考下

引言

上一篇介紹了axios的簡(jiǎn)單封裝,知道了axios攔截器的應(yīng)用場(chǎng)景和方法,今天來(lái)看一下對(duì)于響應(yīng)時(shí)間過(guò)長(zhǎng)且請(qǐng)求次數(shù)過(guò)高的情況攔截器如何處理。

取消請(qǐng)求的方法

Axios使用內(nèi)部提供的CancelToken來(lái)取消請(qǐng)求

官網(wǎng)示例1:用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 {
     // 處理錯(cuò)誤
  }
});

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

// 取消請(qǐng)求(message 參數(shù)是可選的)
source.cancel('Operation canceled by the user.');

官網(wǎng)示例2:通過(guò)傳遞一個(gè) executor 函數(shù)到 CancelToken 的構(gòu)造函數(shù)來(lái)創(chuàng)建 cancel token:

const CancelToken = axios.CancelToken;
let cancel;

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

// cancel the request
cancel();

可以看到上面都是在單個(gè)請(qǐng)求中創(chuàng)建的 cancel token 實(shí)際工作中我們需要對(duì)所有的請(qǐng)求都進(jìn)行處理,接下來(lái)我們看下如何在攔截器實(shí)現(xiàn)取消請(qǐng)求的功能

攔截器中取消重復(fù)請(qǐng)求

import axios from 'axios'
import baseURL from './config'
import qs from 'qs'

const pendingRequest = new Map(); // 請(qǐng)求對(duì)象
const CancelToken = axios.CancelToken;

axios.defaults.timeout = 30000
axios.defaults.baseURL = baseURL.target

// 添加請(qǐng)求攔截器
axios.interceptors.request.use(function(config) {
  // 在發(fā)送請(qǐng)求之前做些什么
  config.headers = {
      'content-type': 'application/json',
      'token': getToken()
  }
  // 獲取請(qǐng)求key
  let requestKey = getReqKey(config);

  // 判斷是否是重復(fù)請(qǐng)求
  if (pendingRequest.has(requestKey)) { // 是重復(fù)請(qǐng)求
    removeReqKey(requestKey); // 取消
  }else{
    // 設(shè)置cancelToken
    config.cancelToken = new CancelToken(function executor(cancel) {
      pendingRequest.set(requestKey, cancel); // 設(shè)置
    })
  }

  return config;
}, function (error) {
  // 請(qǐng)求錯(cuò)誤
  return Promise.reject(error);
});

// 添加響應(yīng)攔截器
axios.interceptors.response.use(function (response) {
  // 請(qǐng)求對(duì)象中刪除requestKey
  let requestKey = getReqKey(response.config);
  removeReqKey(requestKey);

  // 對(duì)返回?cái)?shù)據(jù)做點(diǎn)啥 比如狀態(tài)進(jìn)行攔截
  if (response.data.status !== 200) {
      Toast({
        message: response.data.message,
        type: 'warning',
        duration: 1000
      })
      return
    }
    
  // 沒(méi)問(wèn)題 返回服務(wù)器數(shù)據(jù)
  return response.data;
}, function (error) {
  let requestKey = getReqKey(error.config);
  removeReqKey(requestKey);
  
  // 響應(yīng)錯(cuò)誤
  return Promise.reject(error);
});

// 獲取請(qǐng)求key
function getReqKey(config) {
  // 請(qǐng)求方式、請(qǐng)求地址、請(qǐng)求參數(shù)生成的字符串來(lái)作為是否重復(fù)請(qǐng)求的依據(jù)
  const { method, url, params, data } = config; // 解構(gòu)出來(lái)這些參數(shù)
  // GET ---> params  POST ---> data
  const requestKey =  [ method, url, qs.stringify(params), qs.stringify(data)].join('&');
  return requestKey;
}

// 取消重復(fù)請(qǐng)求
function removeReqKey(key) {
  const cancelToken = pendingRequest.get(key);
  cancelToken(key); // 取消之前發(fā)送的請(qǐng)求
  pendingRequest.delete(key); // 請(qǐng)求對(duì)象中刪除requestKey
}

結(jié)語(yǔ)

以上就是對(duì)重復(fù)請(qǐng)求的處理,如果對(duì)攔截器不清楚的可以看下上篇文章,有問(wèn)題歡迎大家提出指正,我會(huì)在第一時(shí)間更新。

到此這篇關(guān)于vue axios攔截器常用之重復(fù)請(qǐng)求取消的文章就介紹到這了,更多相關(guān)axios攔截器重復(fù)請(qǐng)求取消內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue+ElementUI表格狀態(tài)區(qū)分,row-class-name屬性詳解

    Vue+ElementUI表格狀態(tài)區(qū)分,row-class-name屬性詳解

    這篇文章主要介紹了Vue+ElementUI表格狀態(tài)區(qū)分,row-class-name屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件

    利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件

    在開(kāi)發(fā)中如果上傳的文件過(guò)大,可以考慮分片上傳,分片就是說(shuō)將文件拆分來(lái)進(jìn)行上傳,將各個(gè)文件的切片傳遞給后臺(tái),然后后臺(tái)再進(jìn)行合并,下面這篇文章主要給大家介紹了關(guān)于利用Vue3+Element-plus實(shí)現(xiàn)大文件分片上傳組件的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 前端配合后端實(shí)現(xiàn)Vue路由權(quán)限的方法實(shí)例

    前端配合后端實(shí)現(xiàn)Vue路由權(quán)限的方法實(shí)例

    一開(kāi)始我還以為vue的路由只能用在工程化的項(xiàng)目里面,其實(shí)不然,下面這篇文章主要給大家介紹了關(guān)于前端配合后端實(shí)現(xiàn)Vue路由權(quán)限的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • vue 項(xiàng)目build錯(cuò)誤異常的解決方法

    vue 項(xiàng)目build錯(cuò)誤異常的解決方法

    這篇文章主要介紹了vue build錯(cuò)誤異常的解決方法 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)

    Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)

    這篇文章主要介紹了Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue3中引入Pinia存儲(chǔ)庫(kù)使用示例詳解

    Vue3中引入Pinia存儲(chǔ)庫(kù)使用示例詳解

    這篇文章主要介紹了Vue3中引入Pinia存儲(chǔ)庫(kù)使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • vue3中批量全局注冊(cè)組件實(shí)例詳解

    vue3中批量全局注冊(cè)組件實(shí)例詳解

    在vue中,我們?cè)趍ain.ts引入的全局注冊(cè)的組件是可以不需要import導(dǎo)入而直接使用的,使用的時(shí)候是自己全局注冊(cè)組件時(shí)的名稱,而不是組件名,這篇文章主要介紹了vue3中批量全局注冊(cè)組件,需要的朋友可以參考下
    2023-05-05
  • Vue3?$emit用法指南(含選項(xiàng)API、組合API及?setup?語(yǔ)法糖)

    Vue3?$emit用法指南(含選項(xiàng)API、組合API及?setup?語(yǔ)法糖)

    這篇文章主要介紹了Vue3?$emit用法指南,使用?emit,我們可以觸發(fā)事件并將數(shù)據(jù)傳遞到組件的層次結(jié)構(gòu)中,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • uniapp開(kāi)發(fā)打包多端應(yīng)用完整方法指南

    uniapp開(kāi)發(fā)打包多端應(yīng)用完整方法指南

    這篇文章主要介紹了uniapp開(kāi)發(fā)打包多端應(yīng)用完整流程指南,包括了uniapp打包小程序,uniapp打包安卓apk,uniapp打包IOS應(yīng)用,需要的朋友可以參考下
    2022-12-12
  • 詳解Vue-Router的安裝與使用

    詳解Vue-Router的安裝與使用

    Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,讓構(gòu)建單頁(yè)面應(yīng)用變得易如反掌。本文介紹下Vue Router的安裝與使用
    2021-06-06

最新評(píng)論