nodejs node for async node.js asynccallback

nodejs - ¿Retrollamadas for-loop y async en node.js?



node js function async (3)

Alternativamente, use el nuevo módulo de subprocesos ( https://github.com/robtweed/Q-Oper8 ) y luego puede hacer todo esto mucho más simplemente usando la codificación sincrónica estándar dentro de los procesos secundarios de los subprocesos, ya que solo tratan con la solicitud de un usuario a la vez

¡Adiós a la lógica asíncrona y devoluciones de llamada anidadas!

Soy nuevo en JavaScript y en node.js. Quiero recorrer un directorio y agregar todas las estadísticas del archivo (no otros directorios) a una matriz. Como se ve a continuación, hay un problema con mi código, ya que la devolución de llamada probablemente se llamará después de que el bucle for haya terminado, por lo que el uso de la variable "i" en el método de devolución de llamada no funcionará. Pero, ¿cómo debería verse el código para que funcione el siguiente fragmento de código? ¿Tiene algo que ver con los cierres?

¡Gracias por la ayuda!

fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { for(var i = 0; i < files.length; i++) { var imgFilePath = SYNCDIR + ''/'' + files[i]; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[i] = stat; // This will not be correct since the for-loop has finished } }); } } });


Tienes razón sobre la necesidad de utilizar un cierre. Debería envolver el contenido del bucle for en una función de auto-invocación para preservar el valor de i para cada iteración.

fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { for(var i = 0; i < files.length; i++) { (function(i) { var imgFilePath = SYNCDIR + ''/'' + files[i]; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[i] = stat; } }); })(i); } } });


Una forma es reescribir las entrañas del bucle para usar un cierre:

fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { for(var i = 0; i < files.length; i++) { (function(index) { var imgFilePath = SYNCDIR + ''/'' + files[index]; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[index] = stat; } }); })(i); } } });

Un ejemplo con mejor aspecto, logrando lo mismo, utilizando Array.prototype.forEach:

fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { files.forEach(function(file, i) { var imgFilePath = SYNCDIR + ''/'' + file; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[i] = stat; } }); }); } });