class TaskParallel{
constructor(parallelcount=2){
this.parallelcount=parallelcount;
this.tasks=[];
this.runningCount=0;
}
add(task){
return new Promise((resolve,reject)=>{
this.tasks.push({
task,resolve,reject
});
this._runtask();
})
}
_runtask(){
while(this.runningCount<this.parallelcount && this.tasks.length>0){
const {task,resolve,reject}=this.tasks.shift();
this.runningCount++;
task().then(resolve,reject).finally(()=>{
this.runningCount--;
this._runtask();
})
}
}
}
function timeout(time){
return new Promise((resolve)=>{
setTimeout(()=>{resolve();},time)
})
}
const superTask=new TaskParallel();
function addTask(time,name){
superTask.add(()=>timeout(time)).then(()=>console.log(`task ${name} finish`))
}
addTask(1000,'task1')
addTask(1000,'task11')
addTask(1000,'task21')
addTask(1000,'task31')