当前位置: 首页 > news >正文

前端并发多个请求并失败重发

 const MAX_RETRIES = 3;// 模拟请求
function makeRequest(url) {return new Promise((resolve, reject) => {setTimeout(() => {Math.random() < 0.75 ? resolve(`${url} 成功`) : reject(`${url} 失败`); // 随机决定请求是否成功}, Math.random() * 2000); // 随机延时执行});
}const requestStateMachine = {idle: {MAKE_REQUEST: 'pending',},pending: {SUCCESS: 'resolved',FAILURE: 'retrying',},retrying: {SUCCESS: 'resolved',FAILURE: 'failed',},resolved: {},failed: {},
};function reducer(state, action) {const nextState = requestStateMachine[state.currentState][action.type];if (!nextState) {return state;}return {currentState: nextState,retries: action.type === 'FAILURE' ? state.retries + 1 : 0,};
}async function processRequest(url, dispatch) {if (state.retries < MAX_RETRIES) {try {const response = await makeRequest(url);dispatch({ type: 'SUCCESS' }); // 请求成功return response;} catch (err) {dispatch({ type: 'FAILURE' }); // 请求失败return processRequest(url, dispatch); // 自动重试}} else {dispatch({ type: 'FAILURE' }); // 过多的失败throw new Error('Request failed after maximum retries');}
}const urls = ['urlA', 'urlB', 'urlC'];
const successes = [];
const failures = [];Promise.allSettled(urls.map(async (url) => {let state = {currentState: 'idle',retries: 0,};const dispatch = (action) => {state = reducer(state, action);};try {const response = await processRequest(url, dispatch);successes.push(response);} catch (err) {failures.push(err.message);}})
).then(() => {console.log("成功列表:", successes);console.log("失败列表:", failures);
});

MAX_RETRIES常量设置每个请求允许的最大重试次数。

makeRequest函数模拟一个请求,返回一个Promise,在随机延迟后以随机概率解析或拒绝。

requestStateMachine对象定义了请求处理过程的可能状态和转换。

reducer函数接受当前状态和一个动作作为参数,并根据动作和状态机定义返回下一个状态。

processRequest函数是一个异步函数,它接受一个URL和一个dispatch函数作为参数。它通过调用makeRequest来处理请求,并根据请求的成功或失败派发动作。如果请求失败且重试次数小于最大重试次数(MAX_RETRIES),则会递归调用processRequest进行自动重试。

urls数组包含要进行请求的URL列表。

successes数组用于存储成功的响应结果。

failures数组用于存储失败的请求的错误信息。

使用Promise.allSettled和map方法对每个URL进行请求处理,并将结果存储在相应的数组中。

最后,通过then方法在所有请求处理完成后打印成功列表和失败列表。

这段代码的作用是并行地处理多个异步请求,并在请求失败时自动进行重试,直到达到最大重试次数。成功的响应结果存储在successes数组中,失败的请求的错误信息存储在failures数组中。

相关文章:

前端并发多个请求并失败重发

const MAX_RETRIES 3;// 模拟请求 function makeRequest(url) {return new Promise((resolve, reject) > {setTimeout(() > {Math.random() < 0.75 ? resolve(${url} 成功) : reject(${url} 失败); // 随机决定请求是否成功}, Math.random() * 2000); // 随机延时执…...

【Qt开发流程】之对象模型2:属性系统

描述 Qt提供了一个复杂的属性系统&#xff0c;类似于一些编译器供应商提供的属性系统。然而&#xff0c;作为一个独立于编译器和平台的库&#xff0c;Qt不依赖于非标准的编译器特性&#xff0c;如__property或[property]。 Qt解决方案适用于Qt支持的所有平台上的任何标准c编译…...

PHP之curl详细讲解

cURL&#xff08;全称为Client for URLs&#xff09;是一个功能强大的开源库&#xff0c;用于在多种协议上进行数据传输、发送HTTP请求和获取响应。它支持多种协议&#xff0c;包括HTTP、HTTPS、FTP、SMTP等&#xff0c;并且能够与各种服务器进行通信。 cURL库可以通过命令行工…...

R语言30分钟上手

文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…...

上下拉电阻会增强驱动能力吗?

最近看到一个关于上下拉电阻的问题&#xff0c;发现不少人认为上下拉电阻能够增强驱动能力。随后跟几个朋友讨论了一下&#xff0c;大家一致认为不存在上下拉电阻增强驱动能力这回事&#xff0c;因为除了OC输出这类特殊结构外&#xff0c;上下拉电阻就是负载&#xff0c;只会减…...

题目:小明的彩灯(蓝桥OJ 1276)

题目描述&#xff1a; 解题思路&#xff1a; 一段连续区间加减&#xff0c;采用差分。最终每个元素结果与0比较大小&#xff0c;比0小即负数输出0。 题解&#xff1a; #include<bits/stdc.h> using namespace std;using ll long long; const int N 1e5 10; ll a[N],…...

换元法求不定积分

1.一般步骤&#xff1a;选取换元对象&#xff08;不一定是式子中的值&#xff0c;也可以是式子中的最小公倍数或者最大公因数&#xff09;&#xff0c;然后将dx换为dt*t的导数&#xff0c;再用t将原式表示&#xff0c;化简计算即可 2. 3. 4. 5. 6....

在Docker容器中启用SSH服务,实现外部访问的详细教程

目录 步骤 1: 安装 SSH 服务器 步骤 2: 配置 SSH 服务器 步骤 3: 设置 SSH 用户 步骤 4: 重启 SSH 服务器 步骤 5: 映射容器端口 步骤 6: 使用 SSH 连接到容器 要在Docker容器中启用SSH服务&#xff0c;以便从外部访问&#xff0c;您需要执行以下步骤&#xff1a; 步骤 …...

Go 模块系统最小版本选择法 MVS 详解

目录 Golang 模块系统简介 包版本管理 最小版本选择&#xff08;MVS&#xff09;原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性&#xff0c;主要目的是解决 Go 项目中的依赖管理问题。在模…...

ifstream读取txt中的中文数据转成QString出现乱码

使用ifstream从txt文本中读取中文数据到string&#xff0c;再将string转成QString输出时出现了乱码。 分析&#xff1a;如果ifstream能成功从txt文本中读出中文数据&#xff0c;那大概率txt用的编码是ANSI编码&#xff08;GBK就是ANSI的一种&#xff09;&#xff0c;那么在转成…...

UE4 双屏分辨率设置

背景&#xff1a; 做了一个UI 应用&#xff0c;需要在双屏上进行显示。 分辨率如下&#xff1a;3840*1080&#xff1b; 各种折腾&#xff0c;其实很简单&#xff1a; 主要是在全屏模式的时候 一开始没有选对&#xff0c;双屏总是不稳定。 全屏模式改成&#xff1a;Windows 之…...

$sformat在仿真中打印文本名的使用

在仿真中&#xff0c;定义队列&#xff0c;使用任务进行函数传递&#xff0c;并传递文件名&#xff0c;传递队列&#xff0c;进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串&#xff0c;在仿真的时候进行文件…...

【Rust】结构体与枚举

文章目录 结构体struct基础用法使用字段初始化简写语法使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体方法语法关联函数多个 impl 块 枚举枚举值Option 结构体struct 基础用法 一个存储用户账号信息的结构体&#xff1a; struct User {active: bo…...

CentOS7 防火墙常用命令

以下是在 CentOS 7 上使用 firewall-cmd 命令管理防火墙时的一些常用命令&#xff1a; 检查防火墙状态&#xff1a; sudo firewall-cmd --state 启动防火墙&#xff1a; sudo systemctl start firewalld 停止防火墙&#xff1a; sudo systemctl stop firewalld 重启防火墙&…...

【无标题】什么是UL9540测试,UL9540:2023版本增加哪些测试项目

什么是UL9540测试&#xff0c;UL9540:2023版本增加哪些测试项目 UL 9540是美国安全实验室&#xff08;Underwriters Laboratories&#xff09;发布的标准&#xff0c;名称为"UL 9540: Energy Storage Systems and Equipment"&#xff0c;翻译为中文为"能量存储…...

springcloud整合Oauth2自定义登录/登出接口

我使用的是password模式&#xff0c;并配置了token模式 一、登录 (这里我使用的示例是用户名密码认证方式) 1. Oath2提供默认登录授权接口 org.springframework.security.oauth2.provider.endpoint.postAccess; Tokenpublic ResponseEntity<OAuth2AccessToken> pos…...

Oracle常见内置程序包的使用Package

Oracle常见内置程序包的使用 点击此处可跳转至&#xff1a;Oracle的程序包(Package)&#xff0c;对包的基础进行学习常见内置程序包的使用Package1、DBMS_OUTPUT包2、DBMS_XMLQUERY包3、DBMS_RANDOM包4、UTL_FILE包5、DBMS_JOB包6、DBMS_LOB包7、DBMS_SQL包8、DBMS_LOCK包9、DB…...

Flutter:视频下载案例

前言 最近在研究视频下载&#xff0c;因此打算一边研究一边记录一下。方便以后使用时查看。 使用到的库有&#xff1a; permission_handler 11.1.0 &#xff1a;权限请求 flutter_downloader 1.11.5&#xff1a;文件下载器 path_provider 2.1.1&#xff1a;路径处理 视频…...

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南 第2章&#xff1a;指令提示技术 现在&#xff0c;让我们开始探索“指令提示技术”&#xff0c;以及如何使用它从ChatGPT生成高质量的文本。 指令提示技术是一种通过为模型提供特定指令来指导ChatGPT输出的方…...

JDK 历史版本下载以及指定版本应用

参考&#xff1a; 官网下载JAVA的JDK11版本&#xff08;下载、安装、配置环境变量&#xff09;_java11下载-CSDN博客 Gradle&#xff1a;执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里&#xff0c;但是我们要下载历史版本 选…...

基于Dify平台快速构建AI对话机器人:从部署到生产级实践

1. 项目概述与核心价值最近在折腾AI应用落地的过程中&#xff0c;我反复被一个问题困扰&#xff1a;如何把一个强大的大语言模型&#xff08;LLM&#xff09;能力&#xff0c;快速、低成本地封装成一个能实际解决业务问题的对话机器人&#xff1f;自己从零开始搭框架、写API、处…...

考公学习追踪器:用数据驱动备考,打造个人学习仪表盘

1. 项目概述&#xff1a;一个为“考公”学子量身定制的学习追踪器如果你正在准备公务员考试&#xff0c;或者身边有朋友在“考公”&#xff0c;那你一定对那种“学了忘&#xff0c;忘了学”的循环深有体会。行测的题海、申论的素材、时政的热点&#xff0c;每天的学习任务像一座…...

从C代码到汇编:图解函数调用栈中rsp和rbp的“职责分工”

从C代码到汇编&#xff1a;图解函数调用栈中rsp和rbp的"职责分工" 在计算机程序的执行过程中&#xff0c;函数调用是最基础也最核心的概念之一。当我们从高级语言如C/C深入到汇编层面时&#xff0c;会发现函数调用的背后隐藏着一套精密的栈帧管理机制。本文将带您走进…...

KMS_VL_ALL_AIO智能激活脚本:5分钟搞定Windows和Office永久激活的终极方案

KMS_VL_ALL_AIO智能激活脚本&#xff1a;5分钟搞定Windows和Office永久激活的终极方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office办公软件授权而烦恼吗&…...

多尺度地理加权回归(MGWR)终极指南:从入门到实战的完整教程

多尺度地理加权回归(MGWR)终极指南&#xff1a;从入门到实战的完整教程 【免费下载链接】mgwr Multiscale Geographically Weighted Regression (MGWR) 项目地址: https://gitcode.com/gh_mirrors/mg/mgwr 面对复杂多变的空间数据&#xff0c;传统的地理加权回归(GWR)常…...

【信息科学与工程学】【产品体系】第十二篇 制造业生产加工07 精度与误差库 ——智能制造(4)

表7.100.301—表7.100.329:精度控制高级技术与应用 一、误差补偿与校正(301-305) 表7.100.301:实时误差补偿 编号 概念/技术 在精度控制中的核心价值 7.100.301.1​ 实时误差补偿​ 在系统运行过程中,动态检测误差并实时施加修正的技术。相比离线补偿,能更好地跟踪…...

AI应用开发与AI Agent开发:小白程序员必备技能,收藏学习迎高薪未来!

本文介绍了AI应用开发和AI Agent开发的核心概念和区别&#xff0c;通过传统后端开发、AI应用开发和AI Agent开发三个场景的对比&#xff0c;阐述了AI技术如何赋能产品和服务。AI应用开发是将大模型能力嵌入产品&#xff0c;而AI Agent开发则是让大模型自主完成任务。文章还结合…...

2026年十大最佳小程序制作平台:革新数字化运营体验

小程序制作已成为企业数字化运营的重要抓手&#xff0c;2026年市场涌现多个高效平台。本文聚焦十大主流工具&#xff0c;涵盖从开发效率到生态构建的核心维度。好赞科技凭借地域精准算法领跑&#xff0c;亿点通科技以低代码开发见长&#xff0c;启帆数字突出定制化能力。各平台…...

AI文档智能审查:从NLP原理到企业级部署实战

1. 项目概述&#xff1a;文档的“哨兵”与智能守护者在信息爆炸的时代&#xff0c;我们每天都要与海量的文档打交道——从一份关键的商业合同、一份严谨的学术论文&#xff0c;到一份复杂的项目需求说明书。这些文档不仅是信息的载体&#xff0c;更是决策的依据、合作的基石。然…...

ARM Cortex-M0+极限性能优化:从超频到外设压榨的嵌入式实战

1. 项目概述&#xff1a;一次基于经典平台的极限性能探索“飞思卡尔Freedom打造新记录&#xff01;”这个标题&#xff0c;对于很多嵌入式领域的老兵而言&#xff0c;瞬间就能勾起一段充满挑战与激情的回忆。飞思卡尔&#xff08;Freescale&#xff0c;现为NXP的一部分&#xf…...