node.js:嵌套匿名异步函数中包含的导出变量

时间:2014-01-12 16:51:48

标签: node.js asynchronous

如何导出变量(如下面的“数据”),因此我可以将下面的函数用作模块:

//fooreader.js
var fs = require("fs");
var fileName = "foo.txt";

fs.exists(fileName, function(exists) {
  if (exists) {
    fs.stat(fileName, function(error, stats) {
      fs.open(fileName, "r", function(error, fd) {
        var buffer = new Buffer(stats.size);
        fs.read(fd, buffer, 0, buffer.length, null, function(error, bytesRead, buffer) {
          var data = buffer.toString("utf8", 0, buffer.length);
          console.log(data);
          fs.close(fd);
        });});});}});

我想像模块一样使用它:

//consumer.js
var fooreader = require('fooreader.js');
console.log(fooreader());

我理解在异步读取时可能有点天真,所以我尝试将'fooreader'放入一个接受回调的函数中:

//fooreader.js
var fs = require("fs");
var fileName = "foo.txt";

var fooreader = function(callback){
fs.exists(fileName, function(exists) {
  if (exists) {
    fs.stat(fileName, function(error, stats) {
      fs.open(fileName, "r", function(error, fd) {
        var buffer = new Buffer(stats.size);
        fs.read(fd, buffer, 0, buffer.length, null, function(error, bytesRead, buffer) {
          var data = buffer.toString("utf8", 0, buffer.length);
          console.log(data);
          fs.close(fd);
          callback(data);
        });});});}});};
module.exports = fooreader;

并尝试:

//consumer.js
var fooreader = require('fooreader.js');
fooreader(callback);
var callback = function(data){    
  console.log(data);
}

并得到“TypeError:undefined不是函数”。如何使回调工作?

2 个答案:

答案 0 :(得分:0)

在最后一个片段中调用回调之前定义回调。其他一切看起来都应该有效。

你有:

var fooreader = require('fooreader.js');
fooreader(callback);
var callback = function(data){    
  console.log(data);
}

当您运行fooreader(callback)时,它已定义callback之前。切换命令的顺序,一切都应该有效。

答案 1 :(得分:0)

如果我使用匿名函数来处理回调,它会起作用。这有意义,因为它将函数传递回模块......

//consumer.js
var fooreader = require('fooreader.js');
fooreader(function (data){    
  console.log(data);
});