办法add承受一个返回Promise的函数,同时执行的工作数量不超过两个。

这个一道面试题,限流器保障同时最多只有两个工作在执行,如果工作是异步的,会期待异步工作实现之后,才去执行其余未执行工作。

class Scheduler {    constructor(maxNum) {      this.taskList = [];  //{1}      this.count = 0;      this.maxNum = maxNum;    }    async add(promiseCreator) {      if (this.count >= this.maxNum) {        await new Promise((resolve) => {  //{2}          this.taskList.push(resolve)        })      }      this.count ++;      const result = await promiseCreator();      this.count --;      if (this.taskList.length > 0) {        this.taskList.shift()();    //{3}      }      return result;    }}const scheduler = new Scheduler(2)const timeout = (time)=>{    return new Promise(r=>setTimeout(r, time))}const addTask = (time, order) => {    scheduler.add(()=>timeout(time))        .then(()=>console.log(order))}addTask(1000, 1)addTask(500, 2)addTask(300, 3)addTask(400, 4)//log:2 3 1 4

以上是解答,要害在add办法要怎么实现。

在{1}处定义了一个工作队列。执行add办法,如果此时运行的工作超过了最大限度,就会在{2}处await一个promise,并且把promise的resolve放进工作队列中,这样这个办法就会阻塞在这里,期待promise的实现。而只有在之前的工作实现之后,会去taskList中拿resolve去执行({3}处)。执行完resolve,方才await的promise才会持续往下执行,去执行被阻塞的工作,如此循环,直到所有工作实现。