nodejs patrón de diseño de devolución de llamada paralela

Estoy tratando de encontrar un buen patrón para ejecutar un montón de tareas paralelas.

Permítame definir alguna tarea para ejemplificar. Tareasa, b, c, d, e, f, g ejecutar comoa(function(er, ra){//task a returned, ra is result}), también lo haceb ag

También hay algunas tareas que deben ejecutarse después de realizar alguna tarea, llamémoslasab, bc, abc, bd, bcd, af, fg, significa cuandoa yb ha regresadoab(ra, rb) debe ejecutarse de una vez, y cuandob yc devuelto,bc(rb, rc) debe ejecutarse de una vez, y sia, b, c todo regresó,abc(ra, rb, rc) debe ejecutarse.

Para el caso más simple, si solo haya yb, Puedo hacer algo como esto:

(function(cb){
    var count = 2, _ra, _rb;
    function update(){if(--count == 0) cb(null, _ra, _rb)}
    a(function(er, ra){_ra = ra; update()});
    b(function(er, ra){_rb = rb; update()});
})(function(er, ra, rb){
    ab(ra, rb);
});

Como puedes ver,a yb ejecutar en paralelo, y cuando ambos están hechos,ab(ra, rb) ejecutar.

¿Pero cómo puedo hacer más cosas para muchas tareas paralelas?