当前位置: 首页 > Web前端 > JavaScript

JS实现了一个限流器

时间:2023-03-26 20:54:55 JavaScript

方法add,接受一个返回Promise的函数,同时执行的任务数不超过两个。在这个面试题中,限流器保证最多同时执行两个任务。如果任务是异步的,它将等待异步任务完成,然后再执行其他未执行的任务。类调度程序{构造函数(maxNum){this.taskList=[];//{1}this.count=0;this.maxNum=maxNum;}asyncadd(promiseCreator){if(this.count>=this.maxNum){awaitnewPromise((resolve)=>{//{2}this.taskList.push(resolve)})}this.count++;constresult=awaitpromiseCreator();这个.count--;if(this.taskList.length>0){this.taskList.shift()();//{3}}返回结果;}}constscheduler=newScheduler(2)consttimeout=(time)=>{returnnewPromise(r=>setTimeout(r,time))}constaddTask=(time,order)=>{scheduler.add(()=>timeout(time)).then(()=>console.log(order))}addTask(1000,1)addTask(500,2)addTask(300,3)addTask(400,4)//日志:2314以上就是答案,关键是add方法如何实现。任务队列在{1}处定义。执行添加方法。如果此时运行的任务超过最大限制,则会在{2}处等待一个promise,并将promise的resolve放入任务队列,这样这个方法就会阻塞在这里,等待完成承诺。只有在前一个任务完成后,它才会去taskList获取resolve来执行(在{3})。resolve执行完后,会继续执行awaitedpromise来执行阻塞的任务,以此类推,直到所有任务完成。