/**
* 实现一个控制 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);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。