axios請求緩存與重復攔截:“相同請求未完成時,不發起新請求”

import axios from "axios";// 1. 緩存已完成的請求結果(key:請求URL+參數,value:數據)
const requestCache = new Map();
// 2. 記錄正在執行的請求(避免并行重復請求)
const pendingRequests = new Set();// 請求攔截器:發起請求前檢查
axios.interceptors.request.use(config => {// 生成請求唯一標識(URL + 方法 + 參數)const requestKey = `${config.url}-${config.method}-${JSON.stringify(config.params)}`;// 情況1:請求正在執行中,攔截新請求if (pendingRequests.has(requestKey)) {return Promise.reject(new Error("當前請求已在執行,請勿重復觸發"));}// 情況2:請求已緩存,直接返回緩存數據(不發新請求)if (requestCache.has(requestKey)) {return Promise.resolve({ data: requestCache.get(requestKey) });}// 情況3:新請求,加入“正在執行”列表pendingRequests.add(requestKey);return config;
});// 響應攔截器:請求完成后更新緩存/狀態
axios.interceptors.response.use(response => {const requestKey = `${response.config.url}-${response.config.method}-${JSON.stringify(response.config.params)}`;// 1. 緩存請求結果requestCache.set(requestKey, response.data);// 2. 從“正在執行”列表移除pendingRequests.delete(requestKey);return response;},error => {// 錯誤時也移除“正在執行”狀態const requestKey = `${error.config.url}-${error.config.method}-${JSON.stringify(error.config.params)}`;pendingRequests.delete(requestKey);return Promise.reject(error);}
);// 調用示例:相同參數的請求,短時間內只發一次
function fetchStyle() {axios.get("/api/page-style", { params: { theme: "light" } }).then(res => console.log("樣式數據(緩存/新請求):", res.data)).catch(err => console.log("請求攔截:", err.message));
}// 1秒內調用3次,只發1次請求,后2次用緩存
fetchStyle();
setTimeout(fetchStyle, 500);
setTimeout(fetchStyle, 800);

這個地方的set和map使用,為什么不用對象和數組?

  1. 用普通對象 {} 替代 Map:
    可行,但鍵只能是字符串 / Symbol,且判斷鍵是否存在需要用 obj.hasOwnProperty(key)(不如 map.has(key) 直觀)。
  2. 用數組 [] 替代 Set:
    可行,但檢查是否存在需要 array.includes(key)(O (n) 復雜度,數據量大時效率低),且需要手動去重(if (!array.includes(key)) array.push(key))。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95781.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s的SidecarSet配置和initContainers

目錄引言一、k8s如何實現Sidecar這段配置正確嗎?正確的配置方式為什么這樣做?一個簡單的例子總結二、什么是SidecarSet主要功能使用場景示例配置三、也可以通過 initContainers 的 restartPolicy 實現邊車邏輯四、題外話:什么是InitContainer…

PostgreSQL與SQL Server:為什么 PostgreSQL遙遙領先

PostgreSQL與SQL Server:為什么 PostgreSQL遙遙領先 在數據庫領域,PostgreSQL 和 Microsoft SQL Server 長期以來一直是競爭對手。然而,近年來,PostgreSQL 以其性能、靈活性和創新功能讓 SQL Server 望塵莫及。以下是對 PostgreSQL 明顯優越的…

零跑汽車8月交付57066臺,同比增長超88%

零跑汽車官宣,在剛剛過去的8月份,品牌交付57066輛,同比增長超88%再創歷史新高,并實現了連續6個月穩坐新勢力銷冠。目前,零跑旗下共有T03、B10、B01、C01、C10、C11、C16等七款車型在售,得益于零跑堅持全棧自…

DNS地址推薦

DNS地址推薦(2025年最新整理) 以下DNS服務器按使用場景分類,涵蓋國內、國際、安全隱私、游戲優化等需求,均為2025年仍在維護的公共DNS服務: 一、國內通用DNS(適合中國大陸用戶) 國內DNS服務器對…

興趣電商內容數據洞察未來市場走向研究——基于開源AI智能名片鏈動2+1模式S2B2C商城小程序的實踐

摘要:在互聯網電商數據高度透明的當下,“已發生”的品類規模和品類增速數據雖易獲取,但主要反映市場歷史狀況,難以預測未來走向。興趣電商的內容數據因揭示消費者“新需求”和“潛在需求”,在宏觀層面更早體現用戶消費…

【已更新文章+代碼】2025數學建模國賽A題思路代碼文章高教社杯全國大學生數學建模-煙幕干擾彈的投放策略

截止周四晚上11點已更新五個問題完整建模和問題一二的代碼 截止周五早上完整版已更新 可以看主頁最新博文獲取 完整內容請看文末最后的推廣群2.1問題1的分析 問題1是典型的確定性時空幾何與運動學計算問題,核心在于通過建立坐標系下的參數方程,量化煙幕云…

UE4 Rider如何直接調試PC DebugGame

背景1、用UBT 打了一個exe的包,打開時遇到崩潰,想獲知這個崩潰時的中間信息,例如材質信息,于是我直接雙擊 打包位置下的崩潰dmp文件 (MyGame/Saved/Archived/WindowsClient/MyGame/Saved/Crashes/....dmp) …

【FastDDS】Layer DDS之Domain ( 06-Partitions )

在DDS(Data Distribution Service,數據分發服務)中,Partition(分區) 是一種在“域(Domain)”提供的物理隔離基礎上,為發布者(Publisher)和訂閱者(Subscriber)新增的邏輯隔離與通信篩選機制。它的核心作用是在“域”和“主題(Topic)”之外,進一步精細化控制哪些…

FastVLM:高效視覺編碼助力視覺語言模型突破高分辨率效率瓶頸

想要掌握如何將大模型的力量發揮到極致嗎?葉梓老師帶您深入了解 Llama Factory —— 一款革命性的大模型微調工具。 1小時實戰課程,您將學習到如何輕松上手并有效利用 Llama Factory 來微調您的模型,以發揮其最大潛力。 CSDN教學平臺錄播地址…

【HarmonyOS】一步解決彈框集成-快速彈框QuickDialog使用詳解

【HarmonyOS】一步解決彈框集成-快速彈框QuickDialog使用詳解 一、集成的應用背景介紹 最近比較忙,除了工作節奏調整,有重點項目需要跟。業務時間,也因為參加了25年創新大賽,我們網友,組成了鴻蒙超新星研發團隊&#x…

當公司在你電腦上安裝了IP-guard,你必須知道的事

保護公司機密的同時,你的隱私權何在?在現代企業中,為了保護敏感數據和知識產權,很多公司會選擇在員工電腦上安裝監控軟件,IP-guard 就是其中常見的一款。如果你發現公司電腦安裝了IP-guard,以下幾點是你需要…

拆分TypeScript項目的學習收獲:避免緩存問題,peerDependencies,引用本地項目

最近需要將工作中的一個TS包拆出一部分代碼,以便在多個團隊和項目中共享。原以為這會是一項特別簡單的工作,但是也花了兩天才大致拆成功。因此記錄一下,也給有類似需求的同學一點經驗。 所拆項目的大致功能:整個項目的結構大致分為…

無人機各種接頭焊接方法

無人機接頭的焊接直接關系到設備可靠性和飛行安全,以下是常見接頭的焊接方法及注意事項:一、焊接通用原則工具準備恒溫焊臺(推薦溫度:$350 \pm 20^{\circ}\text{C}$)含松芯焊錫絲(直徑0.8mm)助焊…

[Linux] Linux標準塊設備驅動詳解:從原理到實現

Linux標準塊設備驅動詳解:從原理到實現 在Linux系統中,塊設備是存儲系統的核心組成部分,涵蓋了硬盤、固態硬盤(SSD)、U盤、SD卡等各類持久化存儲介質。與字符設備不同,塊設備以固定大小的“塊”為單位進行數…

什么是壓力測試,有哪些方法

壓力測試(Stress Testing)是性能測試的一種,旨在評估系統在極端負載條件下的表現,驗證其穩定性、可靠性和容錯能力。通過模擬超出正常范圍的并發用戶、數據量或請求頻率,發現系統在高負載下的瓶頸(如內存泄…

lua腳本在redis中執行是否是原子性?

lua腳本在redis中執行是否是原子性?以及是否會阻塞其他腳本的執行【客戶端的請求】?先解答第二個問題:是的,保持原子執行。這也是redis中支持lua腳本執行的原因。Lua 腳本在 Redis 中是以原子方式執行的,在 Redis 服務器執行EVAL命…

DeepSeek文獻太多太雜?一招制勝:學術論文檢索的“核心公式”與提問藝術

如果我們想要完成一次學術論文檢索,那我們可以把它想象成一次精準的“學術尋寶”。你不是在漫無目的地閑逛,而是一名裝備精良的“學術尋寶獵人”,你的目標是找到深藏在浩瀚文獻海洋中的“珍寶”(高價值論文)。1 你的尋…

Linux內存管理章節一:深入淺出Linux內存管理:從物理內存到ARM32的用戶與內核空間

引言 如果說操作系統是計算機的心臟,那么內存管理就是它的靈魂脈絡。它默默地工作在Linux內核的最底層,卻決定著整個系統的穩定性、安全性和性能。今天,我們將撥開迷霧,深入探索Linux內存管理的核心概念,并結合熟悉的A…

ECMAScript (5)ES6前端開發核心:國際化與格式化、內存管理與性能

好的,我將根據【國際化與格式化】和【內存管理與性能】這兩個主題,為你生成詳細的課件內容,涵蓋概念、應用和實例。 📗 前端開發核心:國際化與格式化、內存管理與性能 1. 國際化與格式化 (Internationalization & …

3D 可視化數字孿生運維管理平臺:構建 “虛實協同” 的智慧運維新范式

3D 可視化數字孿生運維管理平臺通過 “物理空間數字化建模 實時數據動態映射 智能分析決策”,將建筑、園區、工業設施等物理實體 1:1 復刻為虛擬孿生體,打破傳統運維 “信息割裂、依賴經驗、響應滯后” 的痛點,實現從 “被動搶修” 到 “主…