NodeJS的readFile()函数如何获取文件名?

7
我正在遍历一个包含文件名的数组。对于其中的每个文件名,我都会调用readFile()函数。当相应的回调被调用时,我希望能够获取传递给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).
    });

}

请检查下面的所有解决方案,每个都是正确的。 - MrIzik
3个回答

10

您可以使用闭包来实现:

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

现在每个文件名都保存为函数的参数,并且不会受到循环继续迭代的影响。


6

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

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

这是最简单、最易读和最正确的答案! - TooTallNate
这是正确的,但如果需要预处理,则有一些限制。 - MrIzik

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

}

在这种情况下,Function#bind() 是完全不必要的,只会带来性能损失。你只需要为每个循环迭代创建一个新的闭包即可。像 @danmactough 建议的那样使用 Array#forEach() 是我认为最“清晰”的方法。 - TooTallNate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接