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)
}
)
}
bf
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 最近在 Codewars上做练习,某道题的内容是实现一个 brainFuck(简称BF语言) 解释器(c/pyth...
- 一个小男孩对小女孩说: “我是你的BF。” 女孩扬起童真的脸, 问:“什么是BF?” 男孩嘻嘻笑道: “是Best...