function asyncPool(limit, array, iteratorFn) {
let executing = [] // 正在执行的
let res = [] // 所有结果
let index = 0 // 当前索引
let len = array.length // 整体长度
function enqueue () { //队列函数
if (index === len) return Promise.resolve()
let item = array[index++]
let e = Promise.resolve().then(() => iteratorFn(item))
res.push(e)
let p = e.then(() => {
executing.splice(executing.indexOf(e), 1)
})
executing.push(p)
let r = Promise.resolve()
if (executing.length >= limit) {
r = Promise.race(executing)
}
return r.then(() => enqueue())
}
return enqueue().then(() => Promise.all(res)) // 触发队列执行,并且确保队列执行完之后监控all res
}
const timeout = i => new Promise(resolve => setTimeout(() => {
return resolve(i)
}, i));
asyncPool(2, [1000, 5000, 3000, 2000], timeout).then(results => {
console.log(results)
});