En el siguiente fragmento de código, estas tareas son un objeto de tareas y la definición de la función debe ser tal que el resultado esperado coincida.
Let tasks = { 'a': { job: function(finish){ setTimeout(() => { console.log('A done') finish(); }, 5000) }, dependencies: [] }, 'b': { job: function(finish){ setTimeout(() => { console.log('B done') finish(); }, 2000) }, dependencies: [] }, 'c': { job: function(finish){ setTimeout(() => { console.log('C done') finish(); }, 2000) }, dependencies: ['a', 'b'] }, 'd': { job: function(finish){ setTimeout(() => { console.log('D done') finish(); }, 1000) }, dependencies: [] }, 'e': { job: function(finish){ setTimeout(() => { console.log('E done') finish(); }, 2000) }, dependencies: ['c', 'b'] }, }; // implement a executeTasks function which can be invoked like below executeTasks(tasks, function(){ console.log('all done'); }) function executeTasks(taskList, callback) { // write your code here } // Expected output D done B done A done C done E done All donela función executeTasks tomará una lista de tareas como se muestra en el ejemplo en la parte superior y también una devolución de llamada. La naturaleza de la función es que las tareas se ejecutarán considerando todas las dependencias y una vez que se ejecuten todas las tareas, se debe invocar la devolución de llamada pasada. El resultado esperado es un ejemplo de cómo será el resultado para esa lista de tareas dada.
Use rxjs , forkJoin podría ayudarlo a hacerlo con gracia. https://rxjs.dev/api/index/function/forkJoin