写一个 js 请求的并发Pool

100 阅读1分钟

目的

假设有 100 条数据,但最多可以同时处理 10请求。

基本思路

我们遍历所有请求,按序都加入到 pool 中,这个 pool 可以实现如下的功能

  1. 遍历到请求就加入到 pool 里面,当这个请求处理完成之后自动会从 pool 里面删除
  2. 如果 pool 里面的数量达到了最大值,则等待其中一个处理完成。完成之后再加入进去
  3. 当所有请求遍历完成之后返回结果。我们把遍历到的任务都放到 result 里

第一点实际就是该请求 promise 的 then 方法功能

第二点实际上就是等待最快的一个请求完成,也就是 Promise.race的功能

第三点则是也算的上是 Promise 的 then 功能,因为这个结果是请求完成之后 resolve 的。我们可以通过 Promise.all方法进行结果的返回

一个混淆点

在这里实际上我们用到了两次 then 方法,也就是一个 promise 执行成功之后,可以执行不同的函数,不必在一次 then 注册里面完成。

  • 一个 then 方法是从 pool 里面删除
  • 一个 then 方法是获取请求 resolve 的值

最后的代码

  const results = [];
  const poolSet = new Set();
  for (const task of taskArray) {
    if (poolSet.size >= poolSize) {
      await Promise.race(poolSet); //对应点 2
    }
    const taskPromise = task()
    taskPromise.then(()=> poolSet.delete(taskPromise))
    poolSet.add(taskPromise);
    results.push(taskPromise);
  }
  const ans = await Promise.all(results);
  return ans;