目标:
- 多个请求同时进行
- 需要按照添加任务的顺序执行
- 可设置并发任务数 思路:
从队列里取出任务执行,并保证当前正在执行的任务最多只能maxCount个
class Scheduler {
constructor(maxCount = 2){
this.maxCount = maxCount;
this.taskQueue = [];
this.currentRunTaskNum = 0;
}
add(task){
this.taskQueue.push(task)
}
run(){
if(this.taskQueue.length && this.currentRunTaskNum <this.maxCount){
let diffNum = this.maxCount - this.currentRunTaskNum
for (let index = 0; index < diffNum;index++) {
this.currentRunTaskNum +=1;
const task = this.taskQueue.shift();
task()
.then((res)=>(console.log(res),Promise.resolve(res)))
.catch(err=>Promise.reject(err))
.finally(()=>(this.currentRunTaskNum -=1,this.run()))
}
}
}
}
测试模拟请求
const scheduler = new Scheduler();
const promise1 = ()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('我是第1个')
},1000)
})
}
const promise2 = ()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('我是第2个')
},4000)
})
}
const promise3 = ()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('我是第3个')
},2000)
})
}
const promise4 = ()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('我是第4个')
},1000)
})
}
scheduler.add(promise1)
scheduler.add(promise2)
scheduler.add(promise3)
scheduler.add(promise4)
scheduler.run()
//结果
我是第1个
我是第3个
我是第2个
我是第4个