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 に答える