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();