javascript - example - promesas o async
Async queue, filestream end cómo saber cuándo terminaron ambos (1)
Tengo un pequeño problema al usar async.queue con una cadena de archivos
- Tengo un escenario donde terminará mi filestream
- Establecí fileRead en true
- sin embargo, la cola estará vacía y ya se ha llamado drenaje
- esto lleva a mi "hecho" para nunca ser llamado
¿Cuál es la forma correcta de decir "finalizar la cola" después de que mi extensión de archivos es "final" y la cola está vacía?
var fs = require(''fs'')
, util = require(''util'')
, stream = require(''stream'')
, es = require(''event-stream'');
var async = require(''async'');
var fileRead = false;
var lineNr = 0;
var q = async.queue(function(task, callback) {
task(function(err, lineData){
responseLines.push(lineData);
callback();
});
}, 5);
var q.drain = function() {
if(fileRead){
done(null, responseLines);
}
}
var s = fs.createReadStream(''very-large-file.csv'')
.pipe(es.split())
.pipe(es.mapSync(function(line){
s.pause();
q.push(async.apply(insertIntoDb, line))
s.resume();
})
.on(''error'', function(err){
done(err);
})
.on(''end'', function(){
fileRead = true;
})
);
o ¿hay un mejor uso de asincronización que me permita hacer esto? proceso asincrónico línea por línea con la capacidad de salir temprano si una de las líneas tiene errores
En primer lugar, no estoy seguro de cuánto de su fragmento es un pseudo código, pero var q.drain = ...
no es javascript válido y debería var q.drain = ...
error. Simplemente debería ser q.drain =
cuando está definiendo una propiedad en un objeto existente que no declara una nueva variable. Esta podría ser la razón por la cual su función de drenaje no se activa si no es un pseudo código.
Hay algunas maneras en que podrías lograr lo que creo que estás tratando de hacer. Una sería verificar la longitud de la cola en su controlador final y establecer la función de drenaje si todavía hay elementos para procesar.
.on(''end'', function(){
if(!q.length){
callDone();
}
else {
q.drain = callDone;
}
});
function callDone(){
done(null, responseLines);
}
De hecho, esto indica que "si la cola se procesó, llame a la llamada, si no, ¡llame cuando esté listo!" Estoy seguro de que hay muchas maneras de poner en orden el código, pero espero que esto proporcione una solución a su problema específico.