/**
 * 实现一个控制 promise 并发个数限制在特定个数的函数(限制使用async和await实现):
 * 例:如需要发送 20个 fetch 请求,但是同时限制发送个数在 5 个以内,如果 5 个请求发送出去了还剩15个请求没有发送,前5个请求任何一个请求成功就要将剩余15个中一个添加到4个正在请求的 pool里面,最终并发请求为5。
 * @Param poolLimit 请求个数限制
 * @Param argsArray 请求参数
 * @Param iteratorFn 请求函数
 * @Return promise 执行结果
 */
async function asyncPool(poolLimit, argsArray, iteratorFn) {
  const res = [];
  const excutings = [];
  for (const args of argsArray) {
    let p = Promise.resolve().then(() => iteratorFn(args));
    res.push(p);
    if (poolLimit < argsArray.length) {
      const e = p.then(() => excutings.splice(excutings.indexOf(e), 1));
      excutings.push(e);
      if (excutings.length >= poolLimit) {
        await Promise.race(res);
      }
    }
  }
  return Promise.all(res);
}

PatWu16
71 声望5 粉丝

仰望星空,脚踏实地