Promise 并发限制
Promise 并发限制
背景
如果我们需要保证代码在多个异步事件后执行,会用到
1 | Promise.all(iterable); |
Promise.all 可以保证,当 interable 参数(通常为 promises 数组)都达到 resolve 状态,则执行 then 回调
而 Promise 并发控制是指在每个时刻执行的 promise 数量是固定的(或者说小于 limit 值)
然而我们知道, promise的构造函数是 同步执行 的,也就是说传入到 Promise.all的多个 promise 实例,在其创建的时候已经开始执行了!
所以控制 promise 并发的关键,是控制 promise 的实例化
实现
上面提到,要实现 promise 并发控制,关键是控制 promise 实例
换句话说,就是把生成 promises 数组的控制权,交给并发控制逻辑
我们可以通过一个参数,接受 并发任务数组、并发函数、并发数三个参数,根据并发数监控 promise 的完成状态,批量创建新的 promise,从而达到控制 promises 生成的目的
代码实现
1 | /** |
大概逻辑可以总结为
- 先初始化
limit个 promise 实例,将它们放到executing数组中 - 使用
Promise.race等待这limit个 promise 实例的执行结果 - 一旦某一个 promise 的状态发生变更,就将其从
executing中删除,然后再执行循环生成新的 promise,放入executing中 - 直到所有的 promise 都被执行完,最后使用
Promise.all返回所有 promise 实例的执行结果

使用方式
1 | const timeout = (i) => new Promise((resolve) => setTimeout(() => resolve(i), i)) |
总结
所谓 promise 并发限制,实际上就是控制 promise 的实例化,如果是通过第三方函数,就把创建 promise 的控制权交给第三方即可