目的
假设有 100 条数据,但最多可以同时处理 10请求。
基本思路
我们遍历所有请求,按序都加入到 pool 中,这个 pool 可以实现如下的功能
- 遍历到请求就加入到 pool 里面,当这个请求处理完成之后自动会从 pool 里面删除
- 如果 pool 里面的数量达到了最大值,则等待其中一个处理完成。完成之后再加入进去
- 当所有请求遍历完成之后返回结果。我们把遍历到的任务都放到 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;