Skip to main content
0:01est. 7 min

Scheduler

// https://stackoverflow.com/questions/51850236/javascript-scheduler-implementation-using-promises
// https://www.glassdoor.com/Interview/Write-a-scheduler-in-JavaScript-that-accepts-max-number-of-concurrent-tasks-as-a-parameter-and-schedules-tasks-each-task-m-QTN_2553403.htm
// https://leetcode.com/discuss/interview-question/346402/Uber-or-Phone-Screen-or-Design-a-Throttler

let tasks = [
{
id: "A",
isDone: false,
dependencies: [],
method: (checkIncompleteTasks, cb) => {
setTimeout(() => {
this.isDone = true;
checkIncompleteTasks("A", cb);
}, 500);
},
},
{
id: "B",
isDone: false,
dependencies: [],
method: (checkIncompleteTasks, cb) => {
setTimeout(() => {
this.isDone = true;
checkIncompleteTasks("B", cb);
}, 502);
},
},
{
id: "C",
isDone: false,
dependencies: ["A", "B"],
method: (checkIncompleteTasks, cb) => {
setTimeout(() => {
this.isDone = true;
checkIncompleteTasks("C", cb);
}, 503);
},
},
];

const allDoneCallback = () => {
console.log("all done");
};

const checkIncompleteTasks = (taskName, cb) => {
tasks.map((t) => {
if (t.id == taskName) {
let allDependeniesDone = true;
if (t.dependencies.length) {
t.dependencies.forEach((tdId) => {
tdObj = tasks.filter((tdItem) => tdItem.id == tdId);
if (!tdObj[0].isDone) {
allDependeniesDone = false;
}
});
}
if (allDependeniesDone) {
t.isDone = true;
}
}
return t;
});

runTasks(
tasks.filter((t) => !t.isDone),
cb
);
};

function runTasks(tasks, cb) {
tasks.map(function (t) {
t.method(checkIncompleteTasks, cb);
});
console.log("tasks", tasks.length);
if (tasks.length == 0) {
cb();
}
}
runTasks(tasks, allDoneCallback);