可以了,还有一个问题,为什么in time out:400先于3输出?

class Scheduler {
  race() {
    return Promise.race([...this.main]).then(() => {
            // console.log(`main size ${this.main.size}`)
      if (this.main.size < 2) {
        let willRun = this.queue.shift()();
                this.main.add(willRun);
                willRun.then(() => {
          this.main.delete(willRun);
        });
        return willRun
      } else {
                console.log('have to wait')
        return this.race();
      }
    });
  }

  add(promiseCreator) {
    if (this.queue === undefined) this.queue = [];
    if (this.main === undefined) this.main = new Set();
    this.queue.push(promiseCreator);
    if (this.queue.length && this.main.size < 2) {
      let willRun = this.queue.shift()();
      this.main.add(willRun);
      willRun.then(() => {
        this.main.delete(willRun);
      });
      return willRun;
    } else {
      return this.race();
    }
  }
}

const timeout = time =>
  new Promise(resolve => {
    console.log("in timeout:", time);
    setTimeout(() => {
      resolve();
      //console.log(`${time}timeout`);
    }, time);
  });
const scheduler = new Scheduler();
const addTask = (time, order) => {
  scheduler.add(() => timeout(time)).then(() => console.log(order));
};
addTask(1000, "1");
addTask(500, "2");
addTask(300, "3");
addTask(400, "4"); // output: 2 3 1 4 // 一开始,1、2 两个任务进入队列 // 500ms 时,2 完成,输出 2,任务 3 进队 // 800ms 时,3 完成,输出 3,任务 4 进队 // 1000ms 时,1 完成,输出 1 // 1200ms 时,4 完成,输出 4