调度似乎没有问题,问题在于可测试性不高或者说测试方案不正确: `if(this.running >= 2)`分支里面,并没有去处理`resolve`。 这样就会导致进入这个分支之后,**对应的`Promise`永远没有`resolve`的机会**,那么你试图在`add(...).then`里面执行的检测代码`console.log(order)`就**不可能被执行** 。 另外可以把函数的职责稍加分离,面试的时候图个卷面整洁: class Scheduler { watting = []; MAX_TASK_NUMBER = 2; running = 0; add(promiseCreator, params = [], context = null){ return new Promise((resolver) => { this.watting.push([promiseCreator, params, context, resolver]); this.#checkTasks(); }) } #checkTasks(){ const {MAX_TASK_NUMBER, running} = this; if(running >= MAX_TASK_NUMBER){ return } this.#nextTask(); } async #nextTask(){ const { watting } = this; if(!watting.length){ return } const [task, params, context, callback] = watting.shift(); this.running++; const result = await task.apply(context, params); this.running--; this.#checkTasks(); if(callback){ callback(result); } } }