vue axios攔截器常用之重復(fù)請(qǐng)求取消
引言
上一篇介紹了axios的簡(jiǎn)單封裝,知道了axios攔截器的應(yīng)用場(chǎng)景和方法,今天來看一下對(duì)于響應(yīng)時(shí)間過長(zhǎng)且請(qǐng)求次數(shù)過高的情況攔截器如何處理。
取消請(qǐng)求的方法
Axios使用內(nèi)部提供的CancelToken來取消請(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:通過傳遞一個(gè) executor 函數(shù)到 CancelToken 的構(gòu)造函數(shù)來創(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)行處理,接下來我們看下如何在攔截器實(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
}
// 沒問題 返回服務(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ù)生成的字符串來作為是否重復(fù)請(qǐng)求的依據(jù)
const { method, url, params, data } = config; // 解構(gòu)出來這些參數(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é)語
以上就是對(duì)重復(fù)請(qǐng)求的處理,如果對(duì)攔截器不清楚的可以看下上篇文章,有問題歡迎大家提出指正,我會(huì)在第一時(shí)間更新。
到此這篇關(guān)于vue axios攔截器常用之重復(fù)請(qǐng)求取消的文章就介紹到這了,更多相關(guān)axios攔截器重復(fù)請(qǐng)求取消內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue 3 中使用路由參數(shù)跳轉(zhuǎn)時(shí) watch 觸發(fā)重復(fù)請(qǐng)求問題解決
- vue?禁止重復(fù)點(diǎn)擊發(fā)送多次請(qǐng)求的實(shí)現(xiàn)
- Vue axios庫避免重復(fù)發(fā)送請(qǐng)求的示例介紹
- vue阻止重復(fù)請(qǐng)求實(shí)現(xiàn)示例詳解
- Vue路由切換和Axios接口取消重復(fù)請(qǐng)求詳解
- Vue中Axios中取消請(qǐng)求及阻止重復(fù)請(qǐng)求的方法
- vue axios重復(fù)點(diǎn)擊取消上一次請(qǐng)求封裝的方法
- Vue3 + vue-query 的重復(fù)請(qǐng)求問題解決
相關(guān)文章
vue3中調(diào)用api接口實(shí)現(xiàn)數(shù)據(jù)的渲染以及詳情方式
這篇文章主要介紹了vue3中調(diào)用api接口實(shí)現(xiàn)數(shù)據(jù)的渲染以及詳情方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
vue實(shí)現(xiàn)水波漣漪效果的點(diǎn)擊反饋指令
鼠標(biāo)移入時(shí)的小手、鼠標(biāo)點(diǎn)擊時(shí)按鈕下壓彈起的動(dòng)畫、觸屏應(yīng)用點(diǎn)擊時(shí)的屏幕震動(dòng),這些效果也被統(tǒng)稱為點(diǎn)擊反饋,雖然看似是應(yīng)用中的細(xì)枝末節(jié),但是只要稍微投入一點(diǎn)點(diǎn)心思,帶來的用戶體驗(yàn)提升是十分明顯的,這里作者為小伙伴們推薦一種作者最喜歡的點(diǎn)擊反饋效果。2021-05-05
element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案
本文主要介紹了element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
vue中的代碼如何進(jìn)行斷點(diǎn)調(diào)試
這篇文章主要介紹了vue中的代碼如何進(jìn)行斷點(diǎn)調(diào)試問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
vue中Echarts使用動(dòng)態(tài)數(shù)據(jù)的兩種實(shí)現(xiàn)方式
這篇文章主要介紹了vue中Echarts使用動(dòng)態(tài)數(shù)據(jù)的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10

