Task Scheduling
A task in ID can be only executed and completed if all the dependency tasks are completed.
const schedules = [
{ id: "a", dependencies: ["b", "c"] },
{ id: "b", dependencies: ["d"] },
{ id: "c", dependencies: ["e"] },
{ id: "d", dependencies: [] },
{ id: "e", dependencies: ["f"] },
{ id: "f", dependencies: [] },
];
const schedules = [
{ id: "a", dependencies: ["b", "c"] },
{ id: "b", dependencies: ["d"] },
{ id: "c", dependencies: ["e"] },
{ id: "d", dependencies: [] },
{ id: "e", dependencies: ["c"] },
{ id: "f", dependencies: [] },
];
let totalTasks = schedules.length;
let completedTasks = 0;
let currentTask = 0;
function clearTaskFromScheduleDependencies(id) {
schedules.forEach((task) => {
let index = task.dependencies.indexOf(id);
if (index !== -1) {
task.dependencies.splice(index, 1);
}
});
}
function executeTask() {
while (completedTasks < totalTasks) {
const task = schedules[currentTask];
if (task.dependencies.length === 0 && !task.executed) {
console.log(task.id);
task.executed = true;
completedTasks += 1;
clearTaskFromScheduleDependencies(task.id);
} else if (!task.visited) {
task.visited = 1;
} else if (task.visited > totalTasks) {
console.log("Cycle Detected");
break;
} else {
task.visited += 1;
}
if (currentTask === totalTasks - 1) currentTask = 0;
else currentTask += 1;
}
}
executeTask();
// Output 1:
d
f
b
e
c
a
// Output 2:
d
f
b
Cycle Detected