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 的控制权交给第三方即可