可以了,还有一个问题,为什么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