javascript - 将附加参数传递给 Node js 中 fs.readFile 的回调

标签 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 (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 个值始终传回回调函数。它遵循 error-first callback结构,这意味着第一个参数将是 Error 或 null(如果未发生),下一个参数将包含文件的数据(如果有)。

如果您想在 fs.readFile() 的回调中访问 fileName 变量,那么您需要在与 fs 相同的范围内定义它.readFile() 被调用。这或多或少需要您使用匿名函数。但是,您仍应将其命名为更好的 Error StackTraces。

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

关于javascript - 将附加参数传递给 Node js 中 fs.readFile 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38315052/

相关文章:

java - 从 Firebase (android) 获取数据时如何避免代码重复?

javascript - 测量网页的内存使用情况

javascript - 如何使用具有不同ID的附加子项动态添加多个div?

javascript - Node.js - 使用多个查询异步构建 JSON

node.js - NodeJS csv 数据转储到 s3 对象

ios - Swift 延迟加载属性 Alamofire 请求

javascript - 在 jQuery.ajax 的 beforeSend 中加载异步内容

JavaScript : How to prevent user from entering = in textbox?

javascript - 我们应该在 React 的什么地方发起 API 请求?

node.js - Mongoose 在 Node 中的 "model.findById"之后做一些事情