Async: Versão de async.series em que cada tarefa recebe os resultados de todas as tarefas anteriores

Criado em 16 nov. 2015  ·  5Comentários  ·  Fonte: caolan/async

Freqüentemente, encontro uma situação em que uma tarefa async.series precisa dos resultados de várias tarefas anteriores. async.waterfall é insuficiente, pois fornece apenas o resultado da última tarefa anterior. async, auto é muito detalhado e fornece declaração de dependência desnecessária adicional.

Uma nova função (ou um aprimoramento de async.series) seria útil. Cada tarefa receberia um objeto de resultado contendo os resultados de todas as tarefas anteriores

Nomes possíveis: acumular, sérieAccumular

Exemplo:

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 comentários

Você verificou async.auto ? Ele faz algo muito semelhante ao que você descreve.

Como mencionei, em um cenário de série simples async.auto é muito prolixo, o usuário deve declarar que cada etapa depende da anterior, resultando nessas matrizes feias e nomes de etapas 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}
});

Faremos algumas melhorias no auto na próxima versão principal - sempre coloque o callback por último e também adicionaremos autoInject (# 608) que infere as dependências dos nomes dos parâmetros.

Não gosto dessa proposta porque ela depende da ordem das chaves do objeto - algo que não é garantido em ambientes JS (e só é garantido em Node para objetos pequenos). Com matrizes é possível, mas é muito semelhante a async.waterfall . Não tenho certeza se precisamos de algo entre auto e waterfall , especialmente se estivermos adicionando autoInject .

Uma maneira de realizar o que você deseja:

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

Eu não recomendo tentar usar um objeto para iterar em série.

Fechando isso. Não acho que precisamos de outro método entre series e waterfall no estilo.

Esta página foi útil?
0 / 5 - 0 avaliações