0

Node.js のイベント ループと、イベント プログラミングのしくみを理解しようとしています。私のモジュールがeventのコールバックで何かを返すdata関数をエクスポートするとします:

var http = require('http');

module.exports.send = function send(message) {
    http.request({ hostname: 'google.com' }, function (res) {
        res.setEncoding('utf8');

        res.on('data', function (chunk) {
            return chunk;
        }
    });
};

これはどのように機能しますか?

私が正しく理解している場合http.requestは、非同期操作です。つまり、次のことを意味します。

  1. への呼び出しhttp.requestが実行されます。
  2. プログラム制御はすぐに Node.jsイベント ループに戻ります
  3. リクエストが最終的に何かを返すと (dataイベントが発行されます)、おそらく数分後send関数はデータを返します。前ではありません。

resultであるはずですがundefined、実際にはそうではありません:

var send = require('mymodule').send;

var result = send({});
console.log(result);
4

1 に答える 1

1

考えるべき主なことは、dataコールバックを呼び出すものです。この場合、その関数は Node 内のランダムな場所から呼び出されるため、return chunk;そのチャンクを Node のその部分に返す場合、それを独自のコードに戻すことはありません。それは既に実行が終了しているためです。

実際にそのデータを取得したい場合はsend、データが戻ってきたときにトリガーされる独自のコールバックを渡す必要があります。

module.exports.send = function send(message, callback) {
  http.request({ hostname: 'google.com' }, function (res) {
    res.setEncoding('utf8');

    res.on('data', function (chunk) {
        callback(chunk);
    });
  });
};

次に、次のように呼び出します。

var mod = require('...');
mod.send('message data', function(result){
   console.log(result);
});

dataイベントは何度でも発行できることに注意してください。そのため、すべての値を収集し、イベントが発生chunkしたらコールバックを呼び出します。end

于 2013-02-16T19:54:36.990 に答える