Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS readFile()检索文件名_Javascript_Node.js_Asynchronous_Readfile - Fatal编程技术网

Javascript NodeJS readFile()检索文件名

Javascript NodeJS readFile()检索文件名,javascript,node.js,asynchronous,readfile,Javascript,Node.js,Asynchronous,Readfile,我正在迭代一个包含文件名的数组。对于它们中的每一个,我都调用readFile()。调用相应的回调时,我希望检索作为参数传递给readFile()的文件名。能做到吗 随信附上一个剪贴代码,以更好地解释我的意图 var fs = require("fs"); var files = ["first.txt", "second.txt"]; for (var index in files) { fs.readFile(files[index], function(err, data) {

我正在迭代一个包含文件名的数组。对于它们中的每一个,我都调用
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).
    });

}

您可以使用闭包执行此操作:

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]));
}
现在,每个文件名都保存为函数的参数,并且不会受到循环继续其迭代的影响。

您还可以使用来前置参数
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])
    );

}

您还可以使用
forEach
而不是
for
循环:

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

函数#bind()
在这种情况下是完全不必要的,只是性能上的损失。在这种情况下,每个循环迭代只需要一个新的闭包。使用
数组#forEach()
,就像@danmacrough建议的那样,在我看来是“最干净”的方法。这是最简单、最可读、最正确的答案!这是正确的,但如果需要预处理,则有一些限制。请检查以下所有解决方案。每一个都是正确的。