SOURCE

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 命令行工具 X clear

                    
>
console