最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消Pending請(qǐng)求功能

 更新時(shí)間:2026年04月01日 08:38:46   作者:BumBle  
現(xiàn)代Web應(yīng)用中,當(dāng)用戶在頁面間快速切換時(shí),常常會(huì)遇到一些正在進(jìn)行的網(wǎng)絡(luò)請(qǐng)求繼續(xù)執(zhí)行的問題,本文將介紹如何在Vue項(xiàng)目中通過路由守衛(wèi)實(shí)現(xiàn)自動(dòng)取消pending請(qǐng)求的功能,提高應(yīng)用的性能和用戶體驗(yàn),需要的朋友可以參考下

引言

現(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ì):

  1. 繼續(xù)執(zhí)行并返回?cái)?shù)據(jù),導(dǎo)致新頁面的狀態(tài)被錯(cuò)誤覆蓋
  2. 占用服務(wù)器資源處理不必要的請(qǐng)求
  3. 可能引發(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)原理

  1. 存儲(chǔ)pending請(qǐng)求:使用Map數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)所有正在進(jìn)行的請(qǐng)求及其控制器
  2. 路由守衛(wèi)攔截:在路由切換時(shí)檢查并取消所有pending請(qǐng)求
  3. 請(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ì)

  1. 資源優(yōu)化:避免不必要的網(wǎng)絡(luò)請(qǐng)求,減少服務(wù)器負(fù)載
  2. 用戶體驗(yàn):防止舊頁面數(shù)據(jù)影響新頁面狀態(tài)
  3. 狀態(tài)管理:確保頁面狀態(tài)的一致性
  4. 錯(cuò)誤處理:通過axios的isCancel方法可以優(yōu)雅地處理取消的請(qǐng)求

注意事項(xiàng)

  1. 白名單處理:可以根據(jù)需要為某些重要請(qǐng)求添加白名單,不進(jìn)行取消
  2. 錯(cuò)誤處理:正確處理被取消的請(qǐng)求,避免影響用戶體驗(yàn)
  3. 性能考慮: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)過程詳解

    這篇文章主要介紹了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)

    本文主要介紹了如何在vuejs項(xiàng)目中使用md5加密密碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • vue前端實(shí)現(xiàn)打印下載示例詳解

    vue前端實(shí)現(xiàn)打印下載示例詳解

    這篇文章主要為大家介紹了vue前端實(shí)現(xiàn)打印下載示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • .html頁面引入vue并使用公共組件方式

    .html頁面引入vue并使用公共組件方式

    這篇文章主要介紹了.html頁面引入vue并使用公共組件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue甘特圖vxe-gantt實(shí)現(xiàn)點(diǎn)擊任務(wù)條彈出編輯表單效果

    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
  • 深入了解vue2與vue3的生命周期對(duì)比

    深入了解vue2與vue3的生命周期對(duì)比

    這篇文章主要為大家介紹了vue2與vue3的生命周期對(duì)比,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目

    基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目

    這篇文章主要介紹了基于Vue-cli的一套代碼支持多個(gè)項(xiàng)目的方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下
    2021-03-03
  • Vue 中頁面?zhèn)髦档亩喾N方式小結(jié)

    Vue 中頁面?zhèn)髦档亩喾N方式小結(jié)

    本文主要介紹了Vue 中頁面?zhèn)髦档亩喾N方式小結(jié),主要包括路由傳參、Vuex 狀態(tài)管理、Props 屬性和事件傳遞數(shù)據(jù)這幾種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Vue2 Vue-cli中使用Typescript的配置詳解

    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)值問題

    這篇文章主要介紹了vue組件props不同數(shù)據(jù)類型傳參的默認(rèn)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

海南省| 天祝| 阿尔山市| 湘阴县| 津市市| 英山县| 治多县| 内乡县| 疏附县| 如皋市| 辽阳市| 南开区| 盐亭县| 白银市| 锡林浩特市| 丹阳市| 海淀区| 砚山县| 南川市| 方正县| 酒泉市| 嵩明县| 丹凤县| 南江县| 襄汾县| 桑日县| 沙坪坝区| 华蓥市| 鄂托克旗| 陆河县| 沈丘县| 榆树市| 湖口县| 岳池县| 比如县| 竹溪县| 鲁甸县| 永春县| 韶山市| 兰考县| 清涧县|