Vue路由切換和Axios接口取消重復(fù)請(qǐng)求詳解
前言
在日常前端開發(fā)中, 經(jīng)常會(huì)遇到頻繁發(fā)起的重復(fù)請(qǐng)求, 會(huì)給服務(wù)器及網(wǎng)絡(luò)造成不必要的壓力, 可通過取消重復(fù)請(qǐng)求解決
場(chǎng)景
- 訂單數(shù)據(jù)條件篩選查詢
- 表單提交按鈕頻繁點(diǎn)擊
- 路由頁面切換請(qǐng)求未取消
解決方案
在每個(gè)請(qǐng)求發(fā)起的時(shí)候存儲(chǔ)當(dāng)前存儲(chǔ)的標(biāo)記在一個(gè)數(shù)組或Map中, 針對(duì)每個(gè)請(qǐng)求的時(shí)候在請(qǐng)求攔截中查詢是否重復(fù), 如果已重復(fù)則取消歷史中重復(fù)的請(qǐng)求, 再發(fā)起當(dāng)前請(qǐng)求, 如果沒有重復(fù), 則添加存儲(chǔ)標(biāo)記并正常請(qǐng)求, 已請(qǐng)求完成的清除存儲(chǔ)標(biāo)記
axios中如何取消請(qǐng)求
- 可以使用
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.');- 還可以通過傳遞一個(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();項(xiàng)目中封裝使用
基本變量定義
// 是否取消重復(fù)請(qǐng)求開關(guān)
const cancelDuplicated = true
// 存儲(chǔ)每個(gè)請(qǐng)求中的map
const pendingXHRMap = new Map()
// 取消請(qǐng)求類型定義 便于后期對(duì)此類型不做異常處理
const REQUEST_TYPE = {
DUPLICATED_REQUEST: 'duplicatedRequest'
}設(shè)置重復(fù)標(biāo)記的函數(shù)
const duplicatedKeyFn = (config) => {
// 可在此設(shè)置用戶自定義其他唯一標(biāo)識(shí) 默認(rèn)按請(qǐng)求方式 + 請(qǐng)求地址
return `${config.method}${config.url}`
}添加到請(qǐng)求記錄
const addPendingXHR = (config) => {
if (!cancelDuplicated) {
return
}
const duplicatedKey = JSON.stringify({
duplicatedKey: duplicatedKeyFn(config),
type: REQUEST_TYPE.DUPLICATED_REQUEST
})
config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
if (duplicatedKey && !pendingXHRMap.has(duplicatedKey)) {
pendingXHRMap.set(duplicatedKey, cancel)
}
})
}刪除請(qǐng)求記錄
const removePendingXHR = (config) => {
if (!cancelDuplicated) {
return
}
const duplicatedKey = JSON.stringify({
duplicatedKey: duplicatedKeyFn(config),
type: REQUEST_TYPE.DUPLICATED_REQUEST
})
if (duplicatedKey && pendingXHRMap.has(duplicatedKey)) {
const cancel = pendingXHRMap.get(duplicatedKey)
cancel(duplicatedKey)
pendingXHRMap.delete(duplicatedKey)
}
}axios中使用
// 請(qǐng)求攔截處理
axios.interceptors.request.use(config => {
removePendingXHR(config)
addPendingXHR(config)
...
return config
})
// 響應(yīng)攔截處理
axios.interceptors.response.use(response => {
removePendingXHR(response.config)
...
}, error => {
// 如果是取消請(qǐng)求類型則忽略異常處理
let isDuplicatedType;
try {
const errorType = (JSON.parse(error.message) || {}).type
isDuplicatedType = errorType === REQUEST_TYPE.DUPLICATED_REQUEST;
} catch (error) {
isDuplicatedType = false
}
if (!isDuplicatedType) {
// 其他異常處理
}
})Vue中當(dāng)路由切換頁面的時(shí)候,將上一個(gè)頁面的所有請(qǐng)求取消
router.beforeEach((to, from, next) => {
// 遍歷pendingMap,將上一個(gè)頁面的所有請(qǐng)求cancel掉
pendingXHRMap.forEach((cancel) => {
cancel();
});
pendingXHRMap.clear()
})總結(jié)
本文主要介紹了在日常前端開發(fā)中, 遇到各種情況下頻繁發(fā)起的重復(fù)請(qǐng)求, 會(huì)給服務(wù)器及網(wǎng)絡(luò)造成不必要的壓力, 可通過取消重復(fù)請(qǐng)求解決。
到此這篇關(guān)于Vue路由切換和Axios接口取消重復(fù)請(qǐng)求的文章就介紹到這了,更多相關(guān)Vue Axios接口重復(fù)請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
參考
如何優(yōu)雅的解決”重復(fù)請(qǐng)求“問題
- 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中取消請(qǐng)求及阻止重復(fù)請(qǐng)求的方法
- vue axios攔截器常用之重復(fù)請(qǐng)求取消
- vue axios重復(fù)點(diǎn)擊取消上一次請(qǐng)求封裝的方法
- Vue3 + vue-query 的重復(fù)請(qǐng)求問題解決
相關(guān)文章
vue實(shí)現(xiàn)手機(jī)驗(yàn)證碼登錄
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)手機(jī)驗(yàn)證碼登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Vue實(shí)現(xiàn)指令式動(dòng)態(tài)追加小球動(dòng)畫組件的步驟
這篇文章主要介紹了Vue實(shí)現(xiàn)指令式動(dòng)態(tài)追加小球動(dòng)畫組件的步驟,幫助大家更好的理解和實(shí)用vue,感興趣的朋友可以了解下2020-12-12
VUE中setTimeout和setInterval自動(dòng)銷毀案例
這篇文章主要介紹了VUE中setTimeout和setInterval自動(dòng)銷毀案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Vue引入vuetify框架你需要知道的幾點(diǎn)知識(shí)
這篇文章主要介紹了Vue引入vuetify框架你需要知道的幾點(diǎn)知識(shí),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Vue向下滾動(dòng)加載更多數(shù)據(jù)scroll案例詳解
這篇文章主要介紹了Vue向下滾動(dòng)加載更多數(shù)據(jù)scroll案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
vue監(jiān)聽路由變化時(shí)watch方法會(huì)執(zhí)行多次的原因及解決
這篇文章主要介紹了vue監(jiān)聽路由變化時(shí)watch方法會(huì)執(zhí)行多次的原因及解決,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-04-04
用vue的雙向綁定簡(jiǎn)單實(shí)現(xiàn)一個(gè)todo-list的示例代碼
本篇文章主要介紹了用vue的雙向綁定簡(jiǎn)單實(shí)現(xiàn)一個(gè)todo的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
利用Vite搭建Vue3+ElementUI-Plus項(xiàng)目的全過程
vue3如今已經(jīng)成為默認(rèn)版本了,相信大多數(shù)公司已經(jīng)全面擁抱vue3了,下面這篇文章主要給大家介紹了關(guān)于利用Vite搭建Vue3+ElementUI-Plus項(xiàng)目的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
vue項(xiàng)目嵌套iframe實(shí)現(xiàn)發(fā)送、接收數(shù)據(jù)
這篇文章主要介紹了vue項(xiàng)目嵌套iframe實(shí)現(xiàn)發(fā)送、接收數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
element-ui時(shí)間日期選擇器限制選擇范圍的幾種場(chǎng)景
這篇文章主要給大家介紹了關(guān)于element-ui時(shí)間日期選擇器限制選擇范圍的幾種場(chǎng)景,一般在實(shí)際開發(fā)場(chǎng)景中我們需要對(duì)時(shí)間選擇做一些限制,如不能選擇今天之前的時(shí)間、不能選擇今天以后的日期、限制日期不能大于開始日期等等,需要的朋友可以參考下2023-08-08

