诞生背景:大数量接口并发请求,造成接口堵塞,请求超时。
无痛接入:不需要改变原有的函数调用方式,传参
// limit:限制函数
// max:最大并发数量
class LimitHttp{
constructor(max=10){
this.max = max;
this.tasks = []
this.currentNum = 0
}
createTask(handler,args,resolve,reject){
return ()=>{
handler(...args).then(res=>{
resolve(res)
}).catch(err=>{
reject(err)
}).finally(()=>{
this.currentNum--;
if(this.tasks.length){
let task = this.tasks.shift();
task()
}
})
}
}
limit(handler){
return (...args)=>{
this.currentNum++;
return new Promise((resolve,reject)=>{
let task = this.createTask(handler,args,resolve,reject);
if(this.currentNum<this.max){
task()
}else{
this.tasks.push(task)
}
})
}
}
}
const limitHttp = new LimitHttp(3);//实例化,设置最大并发数量
//模拟get请求
function get(url,data,result){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(result)
},2000)
})
}
let limitGet = limitHttp.limit(get)//改造get函数,返回一个新的函数,拥有原有get函数相同的形参
//模拟并发请求
for(let i=0;i<10;i++){
limitGet('/api',{id:i},i).then(res=>{
console.log('结果:',res)
})
}