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

并发批量请求处理器

✨ 设计目标

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

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

🔧 构造函数参数

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

🔁 核心执行流程

1. start() 启动任务处理

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

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

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

js 复制代码
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() 重试机制处理

js 复制代码
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 次,失败则抛出错误交由上层处理

小结:执行顺序图

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

📚 示例代码

全部代码链接

相关推荐
脑子慢且灵5 天前
【Web前端】JS+DOM来实现乌龟追兔子小游戏
java·开发语言·前端·js·dom
上单带刀不带妹7 天前
Node.js 的流(Stream)是什么?有哪些类型?
node.js·stream·js
丁同亚的博客8 天前
echarts大屏项目指南
echarts·可视化·js·web前端·大屏
乔公子搬砖12 天前
小程序开发提效:npm支持、Vant Weapp组件库与API Promise化(八)
前端·javascript·微信小程序·js·promise·vagrant·事件绑定
110546540116 天前
37、需求预测与库存优化 (快消品) - /供应链管理组件/fmcg-inventory-optimization
前端·信息可视化·数据分析·js
我命由我1234523 天前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
第七种黄昏24 天前
大事件项目拆解:登录访问拦截实现详解
前端框架·vue·js
PineappleCode1 个月前
用 “私房钱” 类比闭包:为啥它能访问外部变量?
前端·面试·js
上单带刀不带妹1 个月前
Web Worker:解锁浏览器多线程,提升前端性能与体验
前端·js·web worke
qq_三哥啊1 个月前
【HTML】<script>元素中的 defer 和 async 属性详解
html·js