实现多个Promise并发执行

534 阅读1分钟

目标:

  • 多个请求同时进行
  • 需要按照添加任务的顺序执行
  • 可设置并发任务数 思路:

从队列里取出任务执行,并保证当前正在执行的任务最多只能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