前端遇到高并發如何解決重復請求

在前端開發中遇到高并發場景時,若不加控制容易出現重復請求,這可能導致接口壓力增加、數據異常、用戶體驗變差等問題。以下是前端防止/解決重復請求的常見方法,按不同場景歸類總結:


🌟 一、常見重復請求場景

  1. 用戶頻繁點擊按鈕:多次觸發相同請求(例如提交表單、下載操作)。

  2. 路由短時間內多次跳轉或刷新:導致重復加載數據。

  3. 多次調用 debounce/throttle 未正確控制函數執行時機

  4. 輪詢或 WebSocket 消息導致并發訪問同一接口


🚀 二、常用解決方案

? 1. 禁用按鈕防止多次點擊

const [loading, setLoading] = useState(false);const handleClick = async () => {if (loading) return;setLoading(true);try {await fetchData();} finally {setLoading(false);}
};
<Button loading={loading} onClick={handleClick}>提交</Button>

? 2. 使用請求緩存 + Map 記錄請求狀態

原理:在請求發出前先檢查是否已有相同請求在進行。

const requestCache = new Map();const requestWithDeduplication = (url: string, options: any = {}) => {if (requestCache.has(url)) {return requestCache.get(url); // 復用已有請求}const req = fetch(url, options).finally(() => {requestCache.delete(url); // 請求結束后清除緩存});requestCache.set(url, req);return req;
};

適合統一封裝 fetchaxios 請求,避免相同參數的并發請求。


? 3. 使用 Axios 的 CancelToken 取消上一次請求

let controller: AbortController | null = null;const request = async (url: string) => {if (controller) {controller.abort(); // 取消上一個請求}controller = new AbortController();try {const res = await fetch(url, { signal: controller.signal });return await res.json();} catch (e) {if (e.name === 'AbortError') {console.log('Request canceled');}}
};

適合搜索聯想、快速切換 tab 等需要 只保留最后一次請求 的場景。


? 4. 使用 debounce/throttle 防抖節流

import { debounce } from 'lodash';const fetchData = debounce((params) => {// 實際請求
}, 300);<input onChange={(e) => fetchData(e.target.value)} />

控制高頻輸入類請求頻率,減少并發請求量。


? 5. 后端冪等 + 前端唯一請求 ID(可選高級方案)

  • 給每次請求生成唯一 ID(如 UUID),發送給后端。

  • 后端對相同 ID 請求只處理一次。

  • 前端避免再做復雜狀態判斷,適合交易、支付類場景。


🧠 小結對照表

場景推薦方案
按鈕多次點擊禁用按鈕 / loading 狀態
相同請求并發請求緩存 Map / Axios CancelToken
輸入頻繁調用接口debounce 防抖
只保留最后一個請求AbortController / CancelToken
表單提交 /交易請求冪等請求唯一 ID + 后端冪等處理

如果你告訴我你遇到的具體是哪個頁面或場景(例如點擊下載、搜索聯想、多 tab 切換等),我可以給出更加定制化的解決方案。

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

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

相關文章

老牌協議再升級,Ethernet IP轉Modbus TCP網關橋接精準灌裝系統

對于消費品包裝制造商而言&#xff0c;灌裝機是最關鍵且昂貴的設備之一。然而&#xff0c;許多公司卻難以應對生產過程中的灌裝波動&#xff0c;從而造成嚴重的財務和生產后果。 在本次網絡研討會中&#xff0c;我們將探討穩聯技術的ethernet ip轉modbus tcp&#xff08;WL-ABC…

骰子游戲(2023睿抗省賽)

骰子游戲 題目描述: 在某個游戲中有一個骰子游戲。 在游戲中&#xff0c;你需要投擲 5 個標準六面骰子&#xff08;骰子為一個正方體&#xff0c;6個面上分別有 1、2、3、4、5、6中的一個數字&#xff0c;骰子的質量均勻&#xff09;&#xff0c;投出的點數根據組合會獲得一…

CMake跨平臺編譯生成:從理論到實戰

一、引言 在當今軟件開發中&#xff0c;跨平臺開發已成為常態。無論是需要在Windows、Linux、macOS等多操作系統上運行&#xff0c;還是在不同的硬件架構&#xff08;如x86、ARM等&#xff09;間部署&#xff0c;跨平臺編譯生成都是一個無法回避的關鍵問題。CMake&#xff0c;…

Python經典算法實戰

在編程的世界里&#xff0c;算法是解決問題的靈魂&#xff0c;而Python以其簡潔優雅的語法成為實現算法的理想語言。無論你是初學者還是有一定經驗的開發者&#xff0c;《Python經典算法實戰》都能帶你深入算法的殿堂&#xff0c;從理論到實踐&#xff0c;一步步構建起扎實的編…

QT的自定義控件

1.比如對label控件進行提升為QPaintPointLabel類&#xff0c;基類選擇QLabel&#xff0c;頭文件建議加上相對路徑&#xff0c;有時候VS識別不出來直接的頭文件&#xff0c;在提升的類中重寫pointEvent&#xff08;&#xff09;函數。

flutter 常用組件詳細介紹、屏幕適配方案

一、常用組件 1.基礎組件 組件說明示例Text顯示文本Text(‘Hello Flutter’, style: TextStyle(fontSize: 20))Image顯示圖片Image.network(‘https://example.com/image.jpg’)Icon顯示圖標Icon(Icons.home, size: 30, color: Colors.blue)RaisedButton / ElevatedButton按鈕…

leetcode 17. Letter Combinations of a Phone Number

題目描述 17. Letter Combinations of a Phone Number 代碼&#xff1a; class Solution {string table[10] {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz&qu…

Web前端大模型實戰:端側翻譯+朗讀流程線+模型音頻數據編碼 - 讓網站快速支持多語言多模態輸出

在以前的文章 前端大模型入門&#xff1a;實戰篇之Vue3Antdvtransformers本地模型實現增強搜索 中介紹了前端使用大模型的文本RAG實現。本文將更進一步&#xff0c;介紹多模態輸出的端側實現。 本文將通過端側大模型技術實現網頁端的實時翻譯與語音合成功能&#xff0c;無需服…

Python包管理工具uv 國內源配置

macOS 下 .config/uv/uv.toml內 pip源 [[index]] url "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/" default true#uv python install 下載源配置無效&#xff0c;需要在項目里配置 # python-install-mirror "https://mirror.nju.edu.cn/githu…

用戶有一個Django模型沒有設置主鍵,現在需要設置主鍵。

用戶有一個Django模型沒有設置主鍵&#xff0c;現在需要設置主鍵。 from django.db import modelsclass CategoryAssistentModel(models.Model):second_level_category models.CharField(max_length100, nullTrue, blankTrue)third_level_category models.CharField(max_len…

搭建 C/C++_CMake_Boost_git 開發環境

搭建 C 開發環境 步驟 1&#xff1a;啟動 Ubuntu 18.04 容器 創建并啟動一個 Ubuntu 18.04 容器&#xff1a; docker run -itd --name cppubuntu ubuntu:18.04-itd&#xff1a;以交互模式運行容器&#xff0c;并在后臺運行。--name cppubuntu&#xff1a;命名容器為 cppubun…

OceanBase數據庫全面指南(查詢進階篇DQL)

文章目錄 一、OceanBase條件查詢詳解——WHERE子句的藝術1.1 WHERE子句基礎語法與原理1.2 基礎條件查詢實戰1.3 高級條件表達式1.4 分布式環境下的條件查詢優化二、OceanBase排序查詢——ORDER BY深度解析2.1 ORDER BY基礎與執行原理2.2 單字段排序實戰2.3 多字段復雜排序2.4 排…

.NET 10 - 嘗試一下Minimal Api的Validation新特性

1.簡單介紹 2025年11月微軟將會發布.NET10&#xff0c;這是LTS(Long Term Support)版本。當前.NET10已經處于Preview4版本&#xff0c;微軟對Runtime, Library, SDK, C#, Asp.NET Core, MAUI等都做了很多enhancement。近些年微軟對Minimal Api一直在持續地更新。在.NET8中, Mi…

vue+threeJS 創建鏤空球體(SphereGeometry)

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“vuethreeJS 創建鏤空球體&#xff08;SphereGeometry&#xff09;”。 上次看到一個做鏤空球體的項目&#xff0c;自己也準備嘗試著做一做。今天終于做完了&#xff0c;并對這個項目進行梳理。 鏤空球體示例效果…

Docker 鏡像打包到本地

保存鏡像 使用 docker save 命令將鏡像保存為一個 tar 文件。命令格式如下&#xff1a; docker save [options] IMAGE [IMAGE...]示例&#xff1a;docker save -o centos.tar centos:latest--output 或 -o&#xff1a;將輸出保存到指定的文件中。 加載鏡像 如果需要在其他機器…

前端常見的安全問題

跨站腳本攻擊(XSS) XSS&#xff08;跨站腳本攻擊&#xff0c;Cross-Site Scripting&#xff09;是一種通過在網頁中注入惡意腳本&#xff0c;從而竊取用戶數據或控制用戶行為的攻擊方式。注入的js跟網頁與原有的js具有同樣的權限&#xff0c;可以獲得server端數據、可以獲取co…

Spring Boot與Disruptor高性能隊列整合指南

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、Disruptor簡介 Disruptor是LMAX公司開發的高性能無鎖隊列框架&#xff0c;其核心設計通過以下特性實現卓越性能&#xff1a; 環形數組結構&#xff08;…

MongoDB CRUD操作完全指南:從入門到精通

在當今數據驅動的時代&#xff0c;數據庫管理系統扮演著至關重要的角色。作為最受歡迎的NoSQL數據庫之一&#xff0c;MongoDB以其靈活的數據模型、卓越的可擴展性和強大的查詢能力贏得了開發者的青睞。本文將全面介紹MongoDB的核心操作——CRUD&#xff08;創建、讀取、更新、刪…

2025/5/25 學習日記 linux進階命令學習

tree:以樹狀結構顯示目錄下的文件和子目錄&#xff0c;方便直觀查看文件系統結構。 -d&#xff1a;僅顯示目錄&#xff0c;不顯示文件。-L [層數]&#xff1a;限制顯示的目錄層級&#xff08;如 -L 2 表示顯示當前目錄下 2 層子目錄&#xff09;。-h&#xff1a;以人類可讀的格…

quickbi實現關聯度分析(復刻PowerBI展示)

quickbi實現關聯度分析&#xff08;復刻PowerBI展示&#xff09; PowerBI通過DAX創建度量值&#xff0c;可以比較輕松的實現不同產品的關聯度分析&#xff0c;即購物籃分析&#xff0c;但如果使用quickbi&#xff0c;則需要通過sql代碼創建一個數據集&#xff0c;然后再通過數…