如何从回调中返回一个函数?

时间:2013-07-09 22:58:20

标签: node.js asynchronous

如果我有以下代码:

var content;
var f = fs.readFile('./index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
    return console.log(content);
});

f();

我得到了以下内容:

f();
^
TypeError: undefined is not a function

如何返回未定义的函数?

我真正的问题,在更大的背景下是以下https://gist.github.com/jrm2k6/5962230

2 个答案:

答案 0 :(得分:3)

您无法在回调代码中有用 return

  1. 在回调中使用return不会为您的代码返回值。 fs.readFile()调用回调本身,因此return值被赋予它。要让您的代码接收它,fs.readFile()必须return从回调获得的值,而不是。{/ p>

  2. 而且,由于fs.readFile()是异步的,它实际上不能。您的代码跨越了两个不同的时间点:

    1. “存在”

      var content;
      var f = fs.readFile('./index.html', /* ... */);
      
      f();
      
    2. “未来”

      /* ... */
      function read(err, data) {
          if (err) {
              throw err;
          }
          content = data;
          return console.log(content);
      }
      /* ... */
      
  3. 您根本无法使用“当前”中的“ Future ”中的值 - 或者,此时,“过去< / EM>“。

    这通常会导致继续使用callback模式,而不是使用return。带上你的"real" code

    var cheerioURLContent = function (url, callback) {
        rest.get(url).on("complete", function (result) {
            callback(cheerio.load(result));
        });
    };
    
    cheerioURLContent('./index.html', function (t) {
        console.log(t);
    });
    

答案 1 :(得分:1)

您可以为自定义事件分配事件处理程序,并从回调中触发(发出)事件。一开始有点难以理解,但非常优雅。

有关示例,请参阅Emitting event in Node.js