执行队列问题?-灵析社区

东三环

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,后面两个回调没执行是什么原因

阅读量:9

点赞量:0

问AI
调度似乎没有问题,问题在于可测试性不高或者说测试方案不正确: "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); } } }