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?
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
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:
async.nextTick
/async.setImmediate
/process.nextTick
/setImmediate
todos le permiten pasar argumentos que se pasarán a la función.