SOURCE

class AjaxPool {
    constructor(maxNumber, retries) {
        this.maxNumber = maxNumber
        this.retries = retries
        this.pool = []
        this.requsetCount = 0
    }

    add(fn) {
        return this._add(fn, this.retries)
    }

    _add(fn, retries) {
        return new Promise((resolve, reject) => {
            const requset = () => {
                this.requsetCount++
                fn().then((res) => {
                    resolve(res)
                }).catch(() => {
                    if (retries) {
                        retries--
                        requset(fn, retries)
                    } else {
                        reject(`retries timeOut! ${retries}`)
                    }
                }).finally(() => {
                    this.requsetCount--
                    next()
                })
            }

            if (this.requsetCount < this.maxNumber) {
                request()
            } else {
                this.pool.push(requset)
            }
        })
    }

    next() {
        if (this.pool.length) {
            const request = this.pool.unshift()
            request()
        }
    }
}

let pool = new AjaxPool(3,3)
let p1 = new Promise((resolve,reject)=>{
    const res = Math.random()
    console.log(res)

    setTimeout(()=>{
    if(1-res){
        resolve('suc1')
    }else{
        reject('err1')
    }  
    }, 500)
})
let p2 = new Promise((resolve,reject)=>{
    const res = Math.random()
    console.log(res)

    setTimeout(()=>{
    if(1-res){
        resolve('suc2')
    }else{
        reject('err2')
    }  
    }, 100)
})
let p3 = new Promise((resolve,reject)=>{
    const res = Math.random()
    console.log(res)
    setTimeout(()=>{
    if(1-res){
        resolve('suc3')
    }else{
        reject('err3')
    }  
    }, 500)
})
let p4 = new Promise((resolve,reject)=>{
    const res = Math.random()
    console.log(res)

    setTimeout(()=>{
    if(1-res){
        resolve('suc4')
    }else{
        reject('err4')
    }  
    }, 400)
})
let p5 = new Promise((resolve,reject)=>{
    const res = Math.random()
    console.log(res)

    setTimeout(()=>{
    if(1-res){
        resolve('suc5')
    }else{
        reject('err5')
    }  
    }, 300)
})

pool.add(p1).then((res)=>{console.log(res)}).catch((e)=>{console.log(e)})
pool.add(p2).then((res)=>{console.log(res)}).catch((e)=>{console.log(e)})
pool.add(p3).then((res)=>{console.log(res)}).catch((e)=>{console.log(e)})
pool.add(p4).then((res)=>{console.log(res)}).catch((e)=>{console.log(e)})
pool.add(p5).then((res)=>{console.log(res)}).catch((e)=>{console.log(e)})
console 命令行工具 X clear

                    
>
console