class Scheduler {
waiting = []
running = 0;
add(promiseCreator) {
return new Promise(resolve => {
if (this.running >= 2) {
this.waiting.push(promiseCreator)
}
else {
this.running++;
promiseCreator().then(() => {
this.running--;
if (this.waiting.length) {
this.add(this.waiting.shift())
}
resolve();
})
}
})
}
}
const timeout = (time) => new Promise(resolve => {
setTimeout(resolve, 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')
题目的场景是实现一个只允许同一时间内最多存在两个执行队列,期间插入的会进入等待队列,然后空闲时间执行。
只允许修改Scheduler里面的内容
现在能执行前两个task,后面两个回调没执行是什么原因
调度似乎没有问题,问题在于可测试性不高或者说测试方案不正确:
if(this.running >= 2)
分支里面,并没有去处理resolve
。这样就会导致进入这个分支之后,对应的
Promise
永远没有resolve
的机会,那么你试图在add(...).then
里面执行的检测代码console.log(order)
就不可能被执行。另外可以把函数的职责稍加分离,面试的时候图个卷面整洁: