Codog

关注微信公众号:Codog代码狗

0%

可控制并发数的Promise方法

这个问题见过几次,头条的笔试有道题好像就是这个意思,最近又看到了类似的题目,试着实现了一下。

题目概述:有20个请求,希望可以控制并发数量为5,每成功一个则继续执行下一个请求,直到所有请求都成功,并按请求参数顺序返回结果数组(可暂时认为所有请求都会成功)

如果没有并发数量限制的话实际就是Promise.all方法,这里相当于一个加强版。

思路,一开始同时并发5个请求。每有一个成功执行数组下一个请求。内部记录请求成功数量和结果数组,达到数组长度时返回结果数组。

参数返回值是一个promise,状态都记录在该对象内部。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Promise.limitAll = function(promises, limit) {
return new Promise(resolve => {
let resolvedCount = 0;
let count = 0;
let res = [];
const len = promises.length;

function next(p, index) {
p().then(r => {
res[index] = r;
// 记录请求成功的数量
resolvedCount ++
// 数组还存在为执行的promise
if (promises.length) {
const p = promises.shift()
next(p, count)
count ++
} else if(resolvedCount === len) {
resolve(res)
}
})
}
// 1. 设置最开始的并发请求为最大值或全部promise数组
while (count < limit && promises.length) {
const p = promises.shift()
next(p, count)
count ++
}
})
}

已发npm包:https://www.npmjs.com/package/promise-limit-all

在线示例:

npm中有很多实现这个功能的第三方包,比如async-pool、es6-promise-pool、p-limit。感兴趣可以看下实现方式

更多参考: https://juejin.cn/post/6844903972776460301