前端遇到高并发如何解决重复请求

在前端开发中遇到高并发场景时,若不加控制容易出现重复请求,这可能导致接口压力增加、数据异常、用户体验变差等问题。以下是前端防止/解决重复请求的常见方法,按不同场景归类总结:


🌟 一、常见重复请求场景

  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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;然后再通过数…