在Node.js中将附加参数传递给fs.readFile回调函数

3

是否可以向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

注意:如果我将回调函数写成匿名函数,我可以访问变量,但是我正在尝试避免进一步嵌套回调。

3个回答

3
不,你不能在回调函数中传递附加值,因为fs.readFile()不支持此功能。它每次只会向回调函数返回2个值。它遵循一个错误优先的回调结构,这意味着第一个参数将是Error,如果没有发生错误,则为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
    }
  });
});

这对我来说是个坏消息。只留给我选择匿名函数的余地了。 - Vivian Ajay Monis

1

实际上,现在有一种方法可以做到这一点。您可以使用.bind函数将一个变量传递给回调函数。

例如:
    for (file of files) {
      fs.readFile(`./${file}`, 'utf8', gotFile.bind({ "filename": file }))
}

在您的回调函数中(例如我的示例中的gotFile),您可以使用变量文件名,如下所示:

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

0
@Aditya所评论的那样,.bind()解决了这个问题,但是提供的代码对我不起作用,所以我是这样让它工作的:
fs.readFile(fullPath, parseXML.bind(null, additionalParameter))

const parseXML = (additionalParameter, error, fileContents) => {
  console.log(additionalParameter)
}

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