2011-12-30 17 views
6

Estoy iterando sobre una matriz que contiene nombres de archivos. Para cada uno de ellos, invoco readFile(). Cuando se invoca la devolución de llamada correspondiente, deseo recuperar el nombre de archivo pasado a readFile() como parámetro. Se puede hacer?NodeJS readFile() recuperar el nombre de archivo

Adjunto un código recortado para explicar mejor mi intención.

var fs = require("fs"); 
var files = ["first.txt", "second.txt"]; 
for (var index in files) { 
    fs.readFile(files[index], function(err, data) { 
     //var filename = files[index]; 
     // If I am not mistaken, readFile() is asynchronous. Hence, when its 
     // callback is invoked, files[index] may correspond to a different file. 
     // (the index had a progression). 
    }); 

} 
+0

Por favor marque todas las soluciones a continuación. cada uno de los cuales es correcto – MrIzik

Respuesta

6

También es posible usar forEach en lugar de un bucle for:

files.forEach(function (file){ 
    fs.readFile(file, function (err, data){ 
    console.log("Reading %s...", file) 
    }) 
}) 
+0

¡Esta es la respuesta más simple, más fácil de leer y la más correcta! – TooTallNate

+0

esto es correcto, pero tiene alguna limitación si se necesita un preprocesamiento. – MrIzik

7

Usted puede hacer que el uso de un cierre:

for (var index in files) { 
    (function (filename) { 
     fs.readFile(filename, function(err, data) { 
      // You can use 'filename' here as well. 
      console.log(filename); 
     }); 
    }(files[index])); 
} 

Ahora, cada nombre de archivo se guarda como parámetro de una función y no se verá afectado por el bucle continúa su iteración.

0

También puede usar Function.prototype.bind para anteponer un argumento. bind devolverá una nueva función que, cuando se invoca, llama a la función original con archivos [índice] como primer argumento.

Pero no tengo idea si esta es una buena manera de hacerlo.

var fs = require("fs"); 
var files = {"first.txt", "second.txt"}; 
for (var index in files) { 
    fs.readFile(files[index], 
     (function(filename, err, data) { 
      //filename 
     }).bind(null, files[index]) 
    ); 

} 
+0

'Function # bind()' en este caso es completamente innecesario, y solo una penalización de rendimiento. Simplemente necesita un nuevo cierre para cada iteración de bucle en este caso. Usar 'Array # forEach()', como @danmactough sugiere, es la forma más "limpia" en mi opinión. – TooTallNate

+0

gracias por abrir mis ojos – MrIzik

Cuestiones relacionadas