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