NodeJS readFile() retrieve filename

2019-04-07 05:14发布

I am iterating over an array which contains filenames. For each of them, I invoke readFile(). When the corresponding callback is invoked, I wish to retrieve the filename passed to readFile() as a parameter. Can it be done?

Enclosed a snipped code to better explain my intention.

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

}

3条回答
放我归山
2楼-- · 2019-04-07 05:43

You could also use forEach instead of a for loop:

files.forEach(function (file){
  fs.readFile(file, function (err, data){
    console.log("Reading %s...", file)
  })
})
查看更多
一夜七次
3楼-- · 2019-04-07 05:48

You can do that using a closure:

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

Now every file name is saved as a function's parameter and won't be affected by the loop continuing its iteration.

查看更多
做自己的国王
4楼-- · 2019-04-07 06:02

You can also use Function.prototype.bind to prepend an argument. bind will return a new function that, when called, calls the original function with files[index] as the first argument.

But no idea if this is a good way to do it.

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

}
查看更多
登录 后发表回答