实现
function PromiseLimit(funcs, limit = 5) {
const list = [...funcs]
const result = []
const executing = []
function queue() {
const func = list.shift()
if (!func) return Promise.all(executing)
const promise = func()
result.push(promise)
const e = promise.then(() => {
executing.splice(executing.indexOf(e), 1)
})
executing.push(e)
if (executing.length >= limit) {
return Promise.race(executing).then(() => queue())
}
return Promise.resolve().then(() => queue())
}
return queue().then(() => Promise.all(result))
}
测试
const result = []
for (let index = 0; index < 10; index++) {
result.push(function () {
return new Promise((resolve, reject) => {
console.log(`开始${index}`, new Date().toLocaleString())
setTimeout(() => {
if (Math.random() > 0.5) {
resolve(index)
} else {
reject(index)
}
console.log(`结束${index}`, new Date().toLocaleString())
}, parseInt(Math.random() * 1000))
})
})
}
PromiseLimit(result).then(
data => {
console.log('成功', data)
},
data => {
console.log('失败', data)
},
)