22. 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(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");