Async: Versión de async.series donde cada tarea recibe los resultados de todas las tareas anteriores

Creado en 16 nov. 2015  ·  5Comentarios  ·  Fuente: caolan/async

Con frecuencia me encuentro con una situación en la que una tarea async.series necesita los resultados de varias tareas anteriores. async.waterfall es insuficiente ya que solo proporciona el resultado de la última tarea anterior. async, auto es demasiado detallado y proporciona una declaración de dependencia adicional e innecesaria.

Una nueva función (o una mejora de async.series) sería útil. Cada tarea recibiría un objeto de resultado que contiene los resultados de todas las tareas anteriores.

Posibles nombres: acumular, serie Acumular

Ejemplo:

async.accumulate({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback, results){
        // results: {one: 1}
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    },
    three: function(callback, results){
         // results: {one: 1, two: 2}
        setTimeout(function(){
            callback(null, results.one + results.two);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2, three: 3}
});
feature question

Todos 5 comentarios

¿Ha revisado async.auto ? Hace algo muy similar a lo que describe.

Como mencioné, en un escenario de serie simple, async.auto es demasiado detallado, el usuario debe declarar que cada paso depende del anterior, lo que da como resultado esas matrices feas y nombres de pasos duplicados

async.auto({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: ["one", function(callback, results){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }],
    three: ["two", function(callback, results){
        setTimeout(function(){
            callback(null, results.one + results.two);
        }, 100);
    }
   ]
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2, three: 3}
});

Vamos a realizar algunas mejoras a la función automática en la próxima versión principal: siempre tenga la devolución de llamada al final y también agregue autoInject (# 608) que infiere las dependencias de los nombres de los parámetros.

No me gusta esta propuesta porque se basa en el orden de las claves del objeto, algo que no está garantizado en los entornos JS (y solo está garantizado en Node para objetos pequeños). Con matrices es posible, pero es demasiado similar a async.waterfall . No estoy seguro de que necesitemos algo entre auto y waterfall , especialmente si estamos agregando autoInject .

Una forma de lograr lo que quieres:

function seriesAccumulate(tasks, done) {
  async.reduce(tasks, [], function (results, task, next) {
    task(results, function (err, result) {
      results.push(result);
      next(err, result);
    });
  }, done);
}

Recomiendo no intentar usar un objeto para iterar en serie.

Cerrando esto. No creo que necesitemos otro método entre series y waterfall con estilo.

¿Fue útil esta página
0 / 5 - 0 calificaciones