// 模拟异步事件
function timeout(time){
return new Promise((reslove)=>{
setTimeout(()=>{
reslove()
},time)
})
}
// 实现一个类,该功能类似于银行窗口办事,排队人都先拿号,窗口只有3个,只要有一个窗口的任务完成,则排队的人去到这个窗口执行任务
class SuperTask{
constructor(maxRunTaskNum=3){
this.taskList=[] // 存放排队的任务数量
this.maxRunTaskNum = maxRunTaskNum //最大并发数量
this.curRunTask=0 // 当前执行的任务数
}
add(fn){
return new Promise((reslove,reject)=>{
this.taskList.push({
fn,
reslove,
reject
})
this._runTask()
})
}
_runTask(){
while(this.curRunTask<this.maxRunTaskNum && this.taskList.length){
this.curRunTask++
const {fn,reject,reslove} = this.taskList.shift()
fn().then(reslove,reject).finally(()=>{
this.curRunTask--
this._runTask()
})
}
}
}
const superTask=new SuperTask()
function addTask(time,name){
superTask.add(()=>timeout(time)).then(()=>{
console.log(`任务${name}完成`)
})
}
addTask(10000,1) //10秒输出1
addTask(5000,2) //5秒输出2
addTask(3000,3) //3秒输出3
addTask(4000,5) // 7秒输出5
addTask(3000,6) //8秒输出6
addTask(4000,7) //
并发任务控制
最新推荐文章于 2024-05-09 00:00:45 发布