5

Node.js を使い始めたばかりです。http.request について基本的な質問があります。いくつかのサーバーからデータを返すいくつかの関数を含む JavaScript モジュールを作成したいと考えています。

コードは次のとおりです。

var mod = (function() {

    var my = {};
    var options = {
        hostname: 'example.com'
    };
    var foo = '';

    my.getBar = function() {
        var req = http.request(options, function(res) {
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                // example.com returns JSON
                // TODO need to be able to get foo from outside this module
                foo = JSON.parse(chunk).bar;
            });
        });
        req.end();
    }
    return my;
}());

取得するには、次のようbarにします。

console.log(mod.getBar());

しかし、私は得るundefined。何か非同期が起こっていると思います.getリクエストが発生し、それが発生している間に、まだ受信されていない結果を出力しようとしますか? 私はそれを同期させる必要があると思いますか?

どうもありがとう。

4

2 に答える 2

5

getBar を見ると、何も返されません。そのため、未定義になります。結果を取得するには、コールバックを getBar に送信する必要があります。

getBar = function (callback){...

結果を最後にコールバックを呼び出します。

res.on('end, function(){
    callback(foo); 
});

また、複数のリクエストを同時に行う場合に備えて、getBar のクロージャー内に foo を入れることをお勧めします。同様に、1 つのチャンクに対して応答が長すぎる場合に備えて、データのチャンクを連結し、最後に解析する必要があります。

最終的に、コードは次のようになります。

var mod = (function() {

    var my = {};
    var options = {
        hostname: 'example.com'
    };

    my.getBar = function(callback) {
        var foo = '';
        var req = http.request(options, function(res) {
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                foo += chunk;
            });
            res.on('end', function () {
                callback(null, JSON.parse(foo).bar); // The null is just to adhere to the de facto standard of supplying an error as first argument
            });
        });
        req.end();
    }
    return my;
}());

次のようにバーを取得します。

mod.getBar(function(err, data) {
    console.log(data);
});
于 2013-05-07T09:26:31.113 に答える