面试那些事

js实现限制并发的Promise调度器

2021-12-07  本文已影响0人  _静夜听雨_

实现一个带并发限制的异步调度器 Scheduler,保证同时运行的任务最多有两个

class Scheduler {
    constructor(limit) {
      this.queue = []
      this.limit = limit
      this.count = 0
    }
    add(time, order) {
      const promiseCreator = () => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log(order)
            resolve()
          }, time)
        })
      }
      this.queue.push(promiseCreator)
    }
    taskStart() {
      for(let i = 0; i < this.limit; i++) {
        this.request()
      }
    }
  
    request() {
      if (!this.queue.length || this.count >= this.limit) return
      this.count++
      this.queue.shift()().then(() => {
        this.count--
        this.request()
      })
    }
  }
  // 测试代码
  const scheduler = new Scheduler(2);
  const addTask = (time, order) => {
    scheduler.add(time, order);
  };
  addTask(1000, "1");
  addTask(500, "2");
  addTask(300, "3");
  addTask(400, "4");
  scheduler.taskStart();
上一篇 下一篇

猜你喜欢

热点阅读