22. Scheduler

书诚小驿2025/02/23前端面经算法JavaScript
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(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')
// output: 2 3 1 4
// 一开始,1、2 两个任务进入队列
// 500ms 时,2 完成,输出 2,任务 3 进队
// 800ms 时,3 完成,输出 3,任务 4 进队
// 1000ms 时,1 完成,输出 1
// 1200ms 时,4 完成,输出 4

答案

function Scheduler() {
  let temp = 0;
  let res = [];
  let len = 0;
  this.add = function (promiseCreator) {
    let myPromise = new Promise((resolve) => {
      temp++;
      if (temp <= 2) {
        resolve(
          promiseCreator().then(function f() {
            if (res.length) {
              let { myresolve, fullfilled } = res.shift();
              myresolve(fullfilled().then(f));
            } else {
              temp = 0;
            }
          })
        );
      } else {
        res.push({ fullfilled: promiseCreator, myresolve: resolve });
      }
    });
    return myPromise;
  };
}
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(100, "4");
最后更新时间' 2025/2/23 01:48:16