Caso de uso complicado para el módulo asíncrono Node.js

Comencé a usar Node.js como mi backend para realizar diferentes operaciones como consultas de base de datos / llamadas a la API, etc. Estaba leyendo sobre Node.js Async y decidí intentarlo. Ha estado trabajando para casos de uso simple en los que quiero algunas tareas en paralelo o en serie, pero de alguna manera he llegado a un requisito en el que necesito una combinación óptima de técnicas de serie / paralelo / cascada de Async.

Caso de uso:

Tengo las siguientes funciones implementadas con devoluciones de llamada:

function A(input, callback) { ... callback(err,result); } function B(input1, input2, callback) { ... callback(err,result); } function C(input, callback) { ... callback(err,result); } function D(input, callback) { ... callback(err,result); } function E(input, callback) { ... callback(err,result); } 

Y su orden de ejecución debe ser como:

A -> [B -> D]
A -> [C -> E]

  • B, D, C, E se ejecutan después de A.
  • D se ejecuta después de B
  • E se ejecuta despues de C
  • B se ejecuta después de A
  • C se ejecuta después de A

  • B, D y C, E no dependen uno del otro, por lo que pueden ejecutarse en paralelo después de que A haya completado la ejecución.

  • D depende de B y debe ejecutarse después de B

  • E depende de C y debe ejecutarse después de C.

Además, necesito pasar datos de cada una de las funciones a sus funciones dependientes. Entonces, A debería ser el resultado de paasing a B y C. Del mismo modo, B pasa a D y C pasa a E.

¿Cómo puedo ejecutarlos eficientemente usando el módulo asíncrono?

Creo que necesito algo como, pero no estoy seguro, sin embargo:

 async.waterfall( A: ..., async.parallel( async.waterfall ( B, D ), async.waterfall ( C, E ) ) ) 

Trate de usar el método automático .

Determina el mejor orden para ejecutar las funciones en tareas, en función de sus requisitos. Cada función puede, opcionalmente, depender de otras funciones que se completen primero, y cada función se ejecuta tan pronto como se cumplen sus requisitos.

Las funciones también reciben un objeto que contiene los resultados de las funciones que se han completado hasta ahora.

Por ejemplo:

 async.auto({ A: function (callback) { callback(null, 'A data'); }, B: ['A', function (results, callback) { // do something with results.A; callback(null, 'B data'); }], C: ['A', function (results, callback) { // do something with results.A; callback(null, 'C data'); }], D: ['A', 'B', function (results, callback) { // do something with results.A and results.B; callback(null, 'D data'); }], E: ['A', 'C', function (results, callback) { // do something with results.A and results.C; callback(null, 'E data'); }] }, function (err, results) { console.log('err = ', err); });