并发任务控制





// 模拟异步事件
function timeout(time){
    return new Promise((reslove)=>{
        setTimeout(()=>{
            reslove()
        },time)
    })
}

// 实现一个类,该功能类似于银行窗口办事,排队人都先拿号,窗口只有3个,只要有一个窗口的任务完成,则排队的人去到这个窗口执行任务
class SuperTask{
    constructor(maxRunTaskNum=3){
        this.taskList=[]  // 存放排队的任务数量
        this.maxRunTaskNum = maxRunTaskNum  //最大并发数量
        this.curRunTask=0 // 当前执行的任务数
    }


    add(fn){
        return new Promise((reslove,reject)=>{
            this.taskList.push({
                fn,
                reslove,
                reject
            })
            this._runTask()
        })
    }
    _runTask(){
        while(this.curRunTask<this.maxRunTaskNum && this.taskList.length){
            this.curRunTask++
            const {fn,reject,reslove} = this.taskList.shift()
            fn().then(reslove,reject).finally(()=>{
                this.curRunTask--
                this._runTask()
            })
        }
    }
}

const superTask=new SuperTask()
function addTask(time,name){
    superTask.add(()=>timeout(time)).then(()=>{
        console.log(`任务${name}完成`)
    })
}

addTask(10000,1) //10秒输出1
addTask(5000,2) //5秒输出2
addTask(3000,3) //3秒输出3    


addTask(4000,5) // 7秒输出5
addTask(3000,6) //8秒输出6
addTask(4000,7) // 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值