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

在js中大量接口调用并发批量请求处理器

并发批量请求处理器

✨ 设计目标

该类用于批量异步请求处理,支持:

  • 自定义并发数
  • 请求节拍控制(延时)
  • 失败重试机制
  • 进度回调通知

🔧 构造函数参数

new BulkRequestHandler({dataList,          // 要处理的数据列表requestFn,         // 每条数据的处理函数(返回Promise)concurrency = 5,   // 并发请求数delay = 100,       // 请求间隔时间(ms)retry = 3,         // 每条数据最大重试次数onProgressUpdate = () => {}  // 进度更新回调函数
})

🔁 核心执行流程

1. start() 启动任务处理

const workers = Array(this.concurrency).fill(null).map(() => this._worker());
await Promise.all(workers);
return this.results;
  • 启动多个“工人(worker)任务”并行处理数据。

  • 每个 worker 会不断从共享的 this.index 中取任务,直到任务取尽

2. _worker() 单个任务工人执行逻辑

while (this.index < this.dataList.length) {const currentIndex = this.index++;const item = this.dataList[currentIndex];try {const result = await this._requestWithRetry(item, this.retry);this.results[currentIndex] = result;} catch (err) {this.results[currentIndex] = {name: item.name,address: item.address,error: err.message,success: false};}this.completed++;this.onProgressUpdate(this.completed);await new Promise((res) => setTimeout(res, this.delay));
}

流程说明:

  • 从共享索引中取出当前任务项。

  • 调用 _requestWithRetry() 尝试处理该项。

  • 处理完成或失败后记录结果。

  • 更新完成数量,并触发进度回调。

  • 可选的节拍等待,避免请求过快

3. _requestWithRetry() 重试机制处理

try {return await this.requestFn(item);
} catch (err) {if (retriesLeft <= 1) throw err;await new Promise(res => setTimeout(res, 200 * (this.retry - retriesLeft + 1)));return await this._requestWithRetry(item, retriesLeft - 1);
}

说明:

  • 如果请求失败,则根据剩余重试次数,指数退避式延迟后重试。

  • 最多重试 retry 次,失败则抛出错误交由上层处理

小结:执行顺序图

start()├─ 创建多个 worker 并发执行├─ 每个 worker 循环取任务│   ├─ 获取 dataList[index++]│   ├─ 尝试执行 requestFn(带重试)│   ├─ 记录结果到 results[]│   ├─ 调用进度回调│   └─ 可选 delay 等待└─ 所有 worker 结束后,返回 results

📚 示例代码

全部代码链接

相关文章:

  • @PostConstruct @PreDestroy
  • 流式渲染 Streaming SSR
  • 深入解析C++核心特性:运算符重载、继承、多态与抽象类
  • 第三节第二部分:Static修饰方法应用场景
  • 学习黑客搜索技巧
  • 解决应用程序在JAR包中运行时无法读取类路径下文件的问题
  • SSH(安全外壳协议)
  • 软件安全(二)优化shellcode
  • FreeRTOS如何实现100%的硬实时性?
  • 龙虎榜——20250509
  • 编译原理实验 之 语法分析程序自动生成工具Yacc实验
  • nvidia-smi 和 nvcc -V 作用分别是什么?
  • 算法设计与分析复习代码(hnust)
  • LVGL源码学习之渲染、更新过程(3)---绘制和刷写
  • 操作系统导论——第26章 并发:介绍
  • 68、微服务保姆教程(十一)微服务的监控与可观测性
  • 专题练习1
  • 赤色世界 陈默传 第一章 另一个陈默
  • 路由组件1
  • java volatile关键字
  • 印巴开始互袭军事目标,专家:冲突“螺旋式升级”后果或不可控
  • 上财发布“AI+课程体系”,人工智能如何赋能财经教育?
  • 上海证监局规范辖区私募经营运作,6月15日前完成自评自纠
  • 外交部:习近平主席同普京总统达成许多新的重要共识
  • 竞彩湃|霍芬海姆看到保级曙光,AC米兰专注于意大利杯
  • A股三大股指低收:银行股再度走强,两市成交11920亿元