2011-12-30 57 views
6

我遍历包含文件名的数组。对于他们每个人,我调用readFile()。当调用相应的回调函数时,我希望检索传递给readFile()的文件名作为参数。可以做到吗?NodeJS readFile()检索文件名

封闭了一段剪切代码,以更好地解释我的意图。

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

请检查以下所有解决方案。每个都是正确的。 – MrIzik 2011-12-30 17:54:31

回答

6

你也可以使用forEach代替for循环:

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

这是最简单,最可读,最正确的答案! – TooTallNate 2011-12-30 17:45:43

+0

这是正确的,但如果需要预处理则会有一些限制。 – MrIzik 2011-12-30 17:51:23

7

你可以做,使用封闭:

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])); 
} 

现在每个文件名保存为一个函数的参数,也不会被环路继续其迭代的影响。

0

您也可以使用Function.prototype.bind预先设定参数。 bind将返回一个新的函数,该函数在调用时以files [index]作为第一个参数调用原始函数。

但不知道这是否是一个好办法。

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()是完全不必要的,只是性能上的损失。在这种情况下,您只需要为每个循环迭代创建一个新的闭包。使用'Array#forEach()',就像@danmactough所暗示的,在我看来是“最干净”的方式。 – TooTallNate 2011-12-30 17:45:22

+0

感谢您打开我的眼睛 – MrIzik 2011-12-30 17:53:54