bf

class LimitPromise{
    constructor(max){
        this._max = max || 6 // 最大执行数量
        this._count = 0 // 当前执行的数量
        this._taskQueue = [] // 队列   
        this.instance = null // 实例 单例模式
    }
    run(caller){
        return new Promise((resolve, reject)=>{
            const task = this._createTask(caller, resolve, reject)
            // 当前执行的数量 > 最大执行数量,就加入队列排队;否则直接执行
            if(this._count >= this._max){
                this._taskQueue.push(task)
            }else {
                task()
            }
        })   
    }
    _createTask(caller, resolve, reject){
        return ()=> {
            caller().then(res =>{
                resolve(res)
            }).catch(err => {
                reject(err)
                //调用finally的promise实例,无论成功和失败都会进入finally中执行
            }).finally(()=>{
                // 执行完成
                this._count--
                if(this._taskQueue.length > 0){
                    // 取出队列中的首位执行
                    const task= this._taskQueue.shift()
                    task()
                }
            })
            this._count++
        }
    }
    static getInstance(max){
        if(!this.instance){
            this.instance = new LimitPromise(max)
        }
        return this.instance
    }
}

// 构获取实例
const limitPromise = LimitPromise.getInstance(3)
const asyncTask = (params) => {
   return new Promise((resolve, reject)=>{
        setTimeout(() => {
            if (params % 2 == 0) {
                resolve({
                    tag:'成功了', params
                })
            } else {
                reject({
                    tag:'失败了', params
                })
            }
        }, 1000)
    })
}

for(let i=0; i<= 100; i++){
    limitPromise.run(() => asyncTask(i)).then(
        result => {
            console.log('result', result)
        },
        error => {
            console.log('error', error)
        }
    )
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在 Codewars上做练习,某道题的内容是实现一个 brainFuck(简称BF语言) 解释器(c/pyth...
    彭逸之阅读 4,716评论 1 0
  • 一个小男孩对小女孩说: “我是你的BF。” 女孩扬起童真的脸, 问:“什么是BF?” 男孩嘻嘻笑道: “是Best...
    Weiyoun阅读 11,457评论 0 2
  • 2号晚我约了男朋友出来聊,我觉得我们俩的问题不是我单方面瞎想可以解决的,问题就是缺乏交流。可能这两个月我看起来都比...
    小猫咪不吃大鲤鱼阅读 1,670评论 0 0
  • 一个小男孩对小女孩说: “我是你的BF。” 女孩扬起童真的脸, 问:“什么是BF?” 男孩嘻嘻笑道: “是Best...
    etme阅读 1,787评论 2 1
  • 你的价值不在于你的身体,在于你的自信和学识。
    谙黍先生阅读 39评论 0 0