class Scheduler{
constructor(maxConcurrency){
this.maxConcurrency = maxConcurrency;
this.currentCount = 0;
this.taskQueue=[];
}
add(task){
return new Promise((resolve)=>{
this.taskQueue.push(()=>{
return task().then(resolve)
})
this.schedule();
})
}
schedule(){
while(this.currentCount<this.maxConcurrency && this.taskQueue.length>0){
const task = this.taskQueue.shift();
this.currentCount++;
task().finally(()=>{
this.currentCount--;
this.schedule();
})
}
}
}
const scheduler = new Scheduler(2);
const createTask=(id,time)=>()=>{
return new Promise((resolve)=>{
console.log(`Task ${id} started`);
setTimeout(()=>{
console.log(`Task ${id} completed`);
resolve();
},time)
})
}
scheduler.add(createTask(1,2000));
scheduler.add(createTask(2,1000));
scheduler.add(createTask(3,1500));
scheduler.add(createTask(4,500));
scheduler.add(createTask(5,3000))
console