Javascript 将附加参数传递到节点js中fs.readFile的回调

Javascript 将附加参数传递到节点js中fs.readFile的回调,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,是否可以将其他参数传递给fs.readFile的回调函数。我有我的代码来读取目录并解析所有XML文档。我需要通过回调链传递文件名以进行额外处理。现在我的代码是 var fs = require('fs'); var path = require('path'); module.exports.extractXMLBody = function (dirPath, ext) { fs.stat(dirPath, function (err, stats) { if (st

是否可以将其他参数传递给fs.readFile的回调函数。我有我的代码来读取目录并解析所有XML文档。我需要通过回调链传递文件名以进行额外处理。现在我的代码是

var fs = require('fs');
var path = require('path');

module.exports.extractXMLBody = function (dirPath, ext) {
    fs.stat(dirPath, function (err, stats) {
        if (stats.isDirectory()) {
            fetchFiles(dirPath, ext, function (listOfFiles) {
                _.each(listOfFiles, function (val, key) {
                    var completePath = dirPath + '/' + val;
                    var fileName = path.basename(val, path.extname(val))
                    // TODO : Figure out to pass additional parameters
                    fs.readFile(fullPath, parseXML);
                });
            });
        }
    });
}
这里,parseXML是我定义为单独函数的回调函数&我想将变量newFileName传递给回调函数parseXML


注意:如果我以匿名函数的形式编写回调函数,我可以将访问权限传递给变量,但我试图避免回调函数的进一步嵌套。

否,您不能将其他值传递给回调函数,因为fs.readFile不支持这一点。它将始终只向回调函数传回2个值。它遵循一个结构,因此这意味着第一个参数将是一个错误,如果没有出现,则为null,并且下一个参数将包含文件的数据(如果有)

如果要访问fs.readFile回调中的fileName变量,则需要在调用fs.readFile的相同范围内定义它。这或多或少需要使用匿名函数。但是,为了更好地跟踪错误,您仍然应该将其命名

_.each(listOfFiles, function (val, key) {
  var completePath = dirPath + '/' + val;
  var fileName = path.basename(val, path.extname(val));

  fs.readFile(fullPath, function parseXML(err, data) {
    if(err) {
      console.log(err);
    }
    else {
      // parseXML and still have access to fileName
    }
  });
});

事实上,你现在有办法做到这一点。可以使用.bind函数将变量传递给回调函数。 例如:

在我的示例中的回调函数gotFile中,使用变量filename如下:

console.log(`Read ${this.file}.json`)

这对我来说是个坏消息。让我别无选择,只能使用匿名函数。
console.log(`Read ${this.file}.json`)