接口数量并发限制

284 阅读1分钟

诞生背景:大数量接口并发请求,造成接口堵塞,请求超时。

无痛接入:不需要改变原有的函数调用方式,传参

// 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)
    })
}