0

如果我有以下代码:

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

4

2 回答 2

3

您不能从回调中有效地调用您的代码。 return

  1. 在回调中使用return不会向您的代码返回值。fs.readFile()调用回调本身,因此将return值赋予它。为了让您的代码接收它,它fs.readFile()必须return是它从回调中获得的值,而它没有。

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

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

您根本不能在“现在”中使用来自“未来”的值——或者,在那时,“过去”。

这通常会导致继续该callback模式而不是使用return. 使用您的真实”代码

var cheerioURLContent = function (url, callback) {
    rest.get(url).on("complete", function (result) {
        callback(cheerio.load(result));
    });
};

cheerioURLContent('./index.html', function (t) {
    console.log(t);
});
于 2013-07-09T23:53:10.403 回答
1

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

有关示例,请参阅Node.js 中的发射事件。

于 2013-07-09T23:14:12.553 回答