可以将最大并发控制想象成景区排队上厕所,正常都在排队, 当坑位紧张的时候就得排队进入, 一个完事了,让下一个进去
function sleep (time, content = '') { // 异步函数
return new Promise((resolve) => {
setTimeout(() => {
resolve(content)
console.log('content', content)
}, time * 1000)
})
}
function bingfa (pArr, count) {
return new Promise((resolve) => {
let res = []
let runnedCount = 0;
const recursive = (pArr, index) => {
Promise.resolve(pArr[index]()).then(
(val) => {
res[index] = val; // 2.收集成果保证顺序
if (runnedCount >= pArr.length) { // 3.记录是不是所有的人都完成了
return resolve(res);
}
recursive(pArr, runnedCount++) // 4.当前蹲坑的完事了 让下一个人进去
}
)
}
for (let i = 0; i < count; i++) {
recursive(pArr, i); // 1.首先排队 让所有的坑都占满。
runnedCount++;
}
})
}
bingfa([() => sleep(1, '1'), () => sleep(13, '13'), () => sleep(1, '2'), () => sleep(1, '3'), () => sleep(1, '4'), () => sleep(1, '5')], 3)