Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消Pending請(qǐng)求功能
引言
現(xiàn)代Web應(yīng)用中,當(dāng)用戶在頁面間快速切換時(shí),常常會(huì)遇到一些正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求繼續(xù)執(zhí)行的問題。這不僅會(huì)浪費(fèi)服務(wù)器資源,還可能導(dǎo)致頁面狀態(tài)不一致。本文將介紹如何在Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消pending請(qǐng)求的功能,提高應(yīng)用的性能和用戶體驗(yàn)。
問題背景
在單頁應(yīng)用(SPA)中,用戶可能會(huì)在短時(shí)間內(nèi)快速切換多個(gè)頁面。如果前一個(gè)頁面的網(wǎng)絡(luò)請(qǐng)求尚未完成,而用戶已經(jīng)跳轉(zhuǎn)到新頁面,這些未完成的請(qǐng)求可能會(huì):
- 繼續(xù)執(zhí)行并返回?cái)?shù)據(jù),導(dǎo)致新頁面的狀態(tài)被錯(cuò)誤覆蓋
- 占用服務(wù)器資源處理不必要的請(qǐng)求
- 可能引發(fā)競(jìng)態(tài)條件,導(dǎo)致數(shù)據(jù)不一致
解決方案:使用AbortController API
現(xiàn)代瀏覽器提供了AbortController API,可以用來取消fetch請(qǐng)求和axios請(qǐng)求。Vue項(xiàng)目中可以通過以下方式實(shí)現(xiàn)自動(dòng)取消pending請(qǐng)求:
實(shí)現(xiàn)原理
- 存儲(chǔ)pending請(qǐng)求:使用Map數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)所有正在進(jìn)行的請(qǐng)求及其控制器
- 路由守衛(wèi)攔截:在路由切換時(shí)檢查并取消所有pending請(qǐng)求
- 請(qǐng)求生命周期管理:在請(qǐng)求開始時(shí)添加到pending列表,在請(qǐng)求完成后移除
實(shí)現(xiàn)解析
1. 創(chuàng)建請(qǐng)求控制器存儲(chǔ)
在src/utils/http.js中,我們使用Map來存儲(chǔ)所有pending請(qǐng)求的控制器:
// 存儲(chǔ)所有pending請(qǐng)求的控制器 export const pendingRequests = new Map()
2. 請(qǐng)求攔截器中添加控制器
在axios的請(qǐng)求攔截器中,為每個(gè)請(qǐng)求創(chuàng)建AbortController并存儲(chǔ):
http.interceptors.request.use(config => {
const controller = new AbortController()
const requestKey = Symbol() // 使用Symbol確保唯一性
config.requestKey = requestKey
config.signal = controller.signal
pendingRequests.set(requestKey, controller)
return config
})
3. 響應(yīng)攔截器中移除控制器
在響應(yīng)攔截器中,請(qǐng)求完成后從pending列表中移除對(duì)應(yīng)的控制器:
http.interceptors.response.use(
response => {
const requestKey = response.config.requestKey
pendingRequests.delete(requestKey)
return response
}
)
4. 路由守衛(wèi)中取消pending請(qǐng)求
在src/main.js中,通過路由守衛(wèi)在頁面切換時(shí)取消所有pending請(qǐng)求:
import { pendingRequests } from './utils/http'
router.beforeEach((to, from, next) => {
if (pendingRequests.size > 0) {
// 遍歷并取消所有pending的請(qǐng)求
pendingRequests.forEach(controller => controller.abort())
// 清空Map
pendingRequests.clear()
}
next()
})
完整流程圖
graph TD
A[發(fā)起請(qǐng)求] --> B[創(chuàng)建AbortController]
B --> C[存儲(chǔ)控制器到pendingRequests]
C --> D[發(fā)送請(qǐng)求]
D --> E[請(qǐng)求完成]
E --> F[從pendingRequests移除控制器]
G[路由切換] --> H[檢查pendingRequests]
H --> I{pendingRequests有請(qǐng)求?}
I -->|是| J[遍歷并取消所有請(qǐng)求]
J --> K[清空pendingRequests]
I -->|否| L[繼續(xù)路由跳轉(zhuǎn)]
K --> L
優(yōu)勢(shì)
- 資源優(yōu)化:避免不必要的網(wǎng)絡(luò)請(qǐng)求,減少服務(wù)器負(fù)載
- 用戶體驗(yàn):防止舊頁面數(shù)據(jù)影響新頁面狀態(tài)
- 狀態(tài)管理:確保頁面狀態(tài)的一致性
- 錯(cuò)誤處理:通過axios的isCancel方法可以優(yōu)雅地處理取消的請(qǐng)求
注意事項(xiàng)
- 白名單處理:可以根據(jù)需要為某些重要請(qǐng)求添加白名單,不進(jìn)行取消
- 錯(cuò)誤處理:正確處理被取消的請(qǐng)求,避免影響用戶體驗(yàn)
- 性能考慮:Map操作的時(shí)間復(fù)雜度為O(1),適合頻繁的增刪操作
總結(jié)
通過在路由守衛(wèi)中自動(dòng)取消pending請(qǐng)求,我們可以顯著提升單頁應(yīng)用的性能和用戶體驗(yàn)。這個(gè)實(shí)現(xiàn)利用了現(xiàn)代瀏覽器的AbortController API,結(jié)合Vue的路由系統(tǒng)和axios的攔截器機(jī)制,提供了一個(gè)優(yōu)雅的解決方案。
在實(shí)際項(xiàng)目中,這種模式可以有效地管理網(wǎng)絡(luò)請(qǐng)求的生命周期,確保應(yīng)用的穩(wěn)定性和響應(yīng)性。希望這篇文章能幫助你更好地理解和實(shí)現(xiàn)這一重要功能!
以上就是Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消Pending請(qǐng)求功能的詳細(xì)內(nèi)容,更多關(guān)于Vue路由守衛(wèi)自動(dòng)取消Pending請(qǐng)求的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue單文件組件開發(fā)實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Vue單文件組件開發(fā)實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
如何在vuejs項(xiàng)目中使用md5加密密碼的實(shí)現(xiàn)
本文主要介紹了如何在vuejs項(xiàng)目中使用md5加密密碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
vue甘特圖vxe-gantt實(shí)現(xiàn)點(diǎn)擊任務(wù)條彈出編輯表單效果
本文將介紹如何使用 vxe-gantt 組件實(shí)現(xiàn)點(diǎn)擊任務(wù)條彈出編輯表單的功能,支持對(duì)任務(wù)的名稱、時(shí)間、進(jìn)度、負(fù)責(zé)人、圖片附件等信息進(jìn)行編輯,感興趣的朋友跟隨小編一起看看吧2026-03-03
基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目
這篇文章主要介紹了基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目的方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-03-03
Vue2 Vue-cli中使用Typescript的配置詳解
Vue作為前端三大框架之一截至到目前在github上以收獲44,873顆星,足以說明其以悄然成為主流。下面這篇文章主要給大家介紹了關(guān)于Vue2 Vue-cli中使用Typescript的配置的相關(guān)資料,需要的朋友可以參考下。2017-07-07
vue組件props不同數(shù)據(jù)類型傳參的默認(rèn)值問題
這篇文章主要介紹了vue組件props不同數(shù)據(jù)類型傳參的默認(rèn)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

