Async: Recurso / suporte - Conjunto de tarefas vazio -> callback final disparado automaticamente no próximo tick?

Criado em 13 abr. 2017  ·  3Comentários  ·  Fonte: caolan/async

Digamos que estejamos usando async.map ou, na verdade, quase qualquer um dos utilitários async

Minha pergunta / solicitação de recurso é - se a matriz / conjunto de tarefas estiver vazio, o assíncrono dispara o retorno de chamada final no próximo tick? Se não, existe uma maneira de dizer ao assíncrono para fazer isso? Seria um bom recurso.
Caso contrário, tenho muito disso em meu código, que é mais detalhado:

async.map([], function(item,cb){

}, function final(err, results){
    process.next(function(){ 
      cb(err,results);
   });
});

para evitar o Zalgo, isso acima é necessário, mas é muito mais agradável de fazer:

async.map([], function(item,cb){

}, cb);

Acho que uma coisa que podemos é verificar se a matriz está vazia e, se estiver, retornar mais cedo com

if(![].length){
   return process.next(cb);
}

o que vocês recomendam?

question

Comentários muito úteis

Sim, @hargasinski está

Uma simplificação que você pode fazer é:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate all permitem que você passe argumentos que serão passados ​​para a função.

Todos 3 comentários

Olá @ORESoftware , obrigado pela pergunta! Para uma matriz / conjunto vazio, async invoca o retorno de chamada final no mesmo tick em que os adiamentos integrados foram removidos em v2.0.0 por motivos de desempenho (não acho async < v2.0.0 teve até um adiamento integrado para este caso).

Uma solução simples é envolver async.map em async.ensureAsync :

async.ensureAsync(async.map)([], function(item, cb) {

}, cb);

ou em algum lugar no início do seu código:

const asyncMap = async.ensureAsync(async.map);
// then call `asyncMap` just as you would `async.map`

Caso contrário, a abordagem process.nextTick que você propôs é perfeitamente válida. Embora, se você estiver escrevendo um código que pode ser usado em um navegador, você deve dar uma olhada em async.setImmediate ou async.nextTick .

Sim, @hargasinski está

Uma simplificação que você pode fazer é:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate all permitem que você passe argumentos que serão passados ​​para a função.

Que bom, eu não sabia disso sobre process.nextTick, etc, isso é incrível

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