并发任务控制
想想在银行取小票排队叫号的场景,最多执行N个任务
function timeout(time){
return new Promise((reslove,reject)=>{
setTimeout(() => {
reslove(time)
}, time);
})
}
class SuperTask{
constructor(parallelCount=2){
this.parallelCount = parallelCount
this.tasks = []
this.runningCount = 0
}
add(task){
return new Promise((reslove,reject)=>{
this.tasks.push({task,reslove,reject})
this._run()
})
}
_run(){
while(this.runningCount < this.parallelCount && this.tasks.length){
this.runningCount++
const {task,reslove,reject} = this.tasks.shift()
task().then(reslove,reject).finally(()=>{
this.runningCount--
this._run()
})
}
}
}
const superTask = new SuperTask()
function addTask(time,name){
superTask
.add(()=>timeout(time))
.then(()=>{
console.log(`任务${name}完成`);
})
}
addTask(10000,1)
addTask(5000,2)
addTask(3000,3)
addTask(4000,4)
addTask(5000,5)
addTask(1000,6)