JSFiddle - React, Tailwind, and code Playground
by kpulkit29
JavaScript
const jobs = [
{ name: 'a', timeout: 100, dependentTasks: ['d'] },
{ name: 'b', timeout: 100, dependentTasks: ['d'] },
{ name: 'c', timeout: 100, dependentTasks: ['e'] },
{ name: 'd', timeout: 100, dependentTasks: ['e'] },
{ name: 'e', timeout: 100, dependentTasks: [] }
];
const runTask = (job) => {
return new Promise((res) => {
setTimeout(() => {
/* console.log(job.name) */
res()
}, job.timeout)
})
}
const indegree = {}, path = {};
function generateGraph() {
for(let job of jobs) {
indegree[job.name] = indegree[job.name] || 0;
for(let dep of job.dependentTasks) {
indegree[dep] = indegree[dep] || 0 ;
indegree[dep]++;
}
}
}
generateGraph();
function dfs() {
let allKeys = Object.keys(indegree);
while(allKeys.length) {
let top = allKeys.shift();
if(indegree[top] != 0) continue;
let job = jobs.find(item => item.name === top);
let currPath = path[top] ? path[top]+top : top;
runTask(job).then(res => {
console.log(currPath)
path[top] = currPath;
for(let dep of job.dependentTasks) {
indegree[dep]--;
path[dep] = path[dep] || ''
path[dep]+=currPath
}
dfs();
})
delete indegree[top];
}
}
dfs();