关于javascript:JS实现一个限流器

27次阅读

共计 921 个字符,预计需要花费 3 分钟才能阅读完成。

办法 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 才会持续往下执行,去执行被阻塞的工作,如此循环,直到所有工作实现。

正文完
 0