一个简单的控制多并发的promise

一个简单的控制多并发的promise

    class limitPromise {
        constructor(max) { 
            /*
            
            * @param _max 表示最大并发数
            * @param _taskQueue 表示任务队列
            */
            this._max = max;
            this._taskQueue= [] 
        }
        
        addTask (task) {
            this._taskQueue.push(task)
        }

        run() {
            // 如果任务队列为空,任务停止
            if(this._taskQueue.length === 0) {
                return 
            }
            let min = Math.min(this._taskQueue.length,this._max);
            // 
            for(let i = 0;i<min; i++) {
                this._max--;
                let task = this._taskQueue.shift()
                task().then(res=>{
                    console.log(res)
                }).finally(()=>{
                    // 任务结束开始下一轮
                    this._max++;
                    this.run()
                })
            }
        }
    }

const limitPromiseObj = new limitPromise(5)

limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第一个")
        },500)
})
})
limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第2个")
        },500)
})
})
limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第3个")
        },500)
})
})
limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第4个")
        },500)
})
})
limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第5个")
        },500)
})
})
limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第6个")
        },600)
})
})
limitPromiseObj.addTask(function() {
    return new Promise((res,rej)=>{
        setTimeout(()=>{
            res("第7个")
        },700)
})
})

limitPromiseObj.run()

原文地址:https://www.cnblogs.com/Rembang/p/14666342.html