题目
// JS实现一个带并发限制的异步调度器Scheduler,// 保证同时运行的任务最多有两个// 完善代码中Scheduler类,使得以下程序能正确输出class Scheduler { add(promiseCreator) { ... } // ...}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(400, '4')addTask(200, '2')addTask(300, '3')addTask(100, '1')// output: 2 4 1 3
答案:
class Scheduler { constructor() { this.tasks = [], // 待运行的任务 this.usingTasks = [] // 正在运行的任务 } // promiseCreator 是一个异步函数,return Promise add(promiseCreator) { return new Promise((resolve, reject) => { promiseCreator.resolve = resolve if (this.usingTasks.length < 2) { this.usingRun(promiseCreator) } else { this.tasks.push(promiseCreator) } }) } usingRun(promiseCreator) { this.usingTasks.push(promiseCreator) promiseCreator().then(() => { promiseCreator.resolve() this.usingMove(promiseCreator) if (this.tasks.length > 0) { this.usingRun(this.tasks.shift()) } }) } usingMove(promiseCreator) { let index = this.usingTasks.findIndex(promiseCreator) this.usingTasks.splice(index, 1) }}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))}// output: 2 3 1 4addTask(1000, '1');addTask(500, '2');addTask(300, '3');addTask(400, '4');