题目

  1. // JS实现一个带并发限制的异步调度器Scheduler,
  2. // 保证同时运行的任务最多有两个
  3. // 完善代码中Scheduler类,使得以下程序能正确输出
  4. class Scheduler {
  5. add(promiseCreator) { ... }
  6. // ...
  7. }
  8. const timeout = (time) => new Promise(resolve => {
  9. setTimeout(resolve, time)
  10. })
  11. const scheduler = new Scheduler();
  12. const addTask = (time, order) => {
  13. scheduler.add(() => timeout(time)).then(() => console.log(order))
  14. }
  15. addTask(400, '4')
  16. addTask(200, '2')
  17. addTask(300, '3')
  18. addTask(100, '1')
  19. // output: 2 4 1 3

答案:

  1. class Scheduler {
  2. constructor() {
  3. this.tasks = [], // 待运行的任务
  4. this.usingTasks = [] // 正在运行的任务
  5. }
  6. // promiseCreator 是一个异步函数,return Promise
  7. add(promiseCreator) {
  8. return new Promise((resolve, reject) => {
  9. promiseCreator.resolve = resolve
  10. if (this.usingTasks.length < 2) {
  11. this.usingRun(promiseCreator)
  12. } else {
  13. this.tasks.push(promiseCreator)
  14. }
  15. })
  16. }
  17. usingRun(promiseCreator) {
  18. this.usingTasks.push(promiseCreator)
  19. promiseCreator().then(() => {
  20. promiseCreator.resolve()
  21. this.usingMove(promiseCreator)
  22. if (this.tasks.length > 0) {
  23. this.usingRun(this.tasks.shift())
  24. }
  25. })
  26. }
  27. usingMove(promiseCreator) {
  28. let index = this.usingTasks.findIndex(promiseCreator)
  29. this.usingTasks.splice(index, 1)
  30. }
  31. }
  32. const timeout = (time) => new Promise(resolve => {
  33. setTimeout(resolve, time)
  34. })
  35. const scheduler = new Scheduler()
  36. const addTask = (time, order) => {
  37. scheduler.add(() => timeout(time)).then(() => console.log(order))
  38. }
  39. // output: 2 3 1 4
  40. addTask(1000, '1');
  41. addTask(500, '2');
  42. addTask(300, '3');
  43. addTask(400, '4');