Async: Característica / soporte - Conjunto de tareas vacío -> ¿la devolución de llamada final se activa automáticamente en el siguiente tick?

Creado en 13 abr. 2017  ·  3Comentarios  ·  Fuente: caolan/async

Digamos que estamos usando async.map o realmente casi cualquiera de las utilidades async

Mi pregunta / solicitud de función es: si la matriz / conjunto de tareas está vacío, ¿async activa la devolución de llamada final en la siguiente marca? Si no es así, ¿hay alguna forma de decirle a async que haga eso? Sería una buena característica.
De lo contrario, tengo mucho de esto en mi código, que es más detallado:

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

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

para evitar Zalgo, esto es necesario, pero es mucho más agradable de hacer:

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

}, cb);

Supongo que una cosa que podríamos es verificar si la matriz está vacía y, de ser así, regresar antes con

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

¿Qué recomiendan todos ustedes?

question

Comentario más útil

Sí, @hargasinski lo tiene en el dinero. No le protegemos de Zalgo por motivos de rendimiento.

Una simplificación que puede hacer es:

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

async.nextTick / async.setImmediate / process.nextTick / setImmediate todos le permiten pasar argumentos que se pasarán a la función.

Todos 3 comentarios

Hola @ORESoftware , ¡gracias por la pregunta! Para una matriz / conjunto vacío, async invoca la devolución de llamada final en el mismo tick ya que los aplazamientos incorporados se eliminaron en v2.0.0 por razones de rendimiento (no creo que async < v2.0.0 incluso tenía un aplazamiento incorporado para este caso).

Una solución alternativa simple es envolver async.map en async.ensureAsync :

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

}, cb);

o en algún lugar al comienzo de su código:

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

De lo contrario, el enfoque process.nextTick que propuso es perfectamente válido. Aunque, si está escribiendo código que podría usarse en un navegador, debería echar un vistazo a async.setImmediate o async.nextTick .

Sí, @hargasinski lo tiene en el dinero. No le protegemos de Zalgo por motivos de rendimiento.

Una simplificación que puede hacer es:

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

async.nextTick / async.setImmediate / process.nextTick / setImmediate todos le permiten pasar argumentos que se pasarán a la función.

Oh, bueno, no sabía eso sobre process.nextTick, etc., eso es increíble

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