2012-02-17 2 views
3

こんにちは、私はNodeJSが非同期であることを知っています(これはまだ私の頭を正直にしています)。NodeJS return http.request

私が現在直面している問題は、私がhttp.requestをいくつかのJSONデータを受け取ろうとしていることです。これは問題ありませんが、私が必要とするのは、このデータを変数に戻すことです。私はコールバック関数を行う必要があると思いますか?

私が現在持っているコード(から私は問題をよく読んだもの):

var http = require('http'); 
pCLatLng = ''; 

function postCodeCheck() { 
    var pCode = { 
     host: 'geo.jamiethompson.co.uk', 
     path: "/" + 'SW1A2AA' + ".json" 
    }; 

    http.request(pCode).on('response', function(response) { 
     var data = ''; 
     response.on("data", function (chunk) { 
      data += chunk; 
     }); 
     response.on('end', function() { 
      pCJSON = JSON.parse(data); 
      pCLatLng = pCJSON; 
     }); 
     }).end(); 
} 

console.log(pCLatLng); 

これは明らかに「未定義」を出力しています。私はresponse.on( 'end')を返そうとしましたが、NodeJSはそのサイトの情報を出力します。誰かがこれを手伝うことができれば、それは非常に高く評価されるだろう。

答えて

5

console.log(pCLatLng);は、response.on('end'コールバックの内部(または内部にあるもの)である必要があります。そのコールバックが呼び出されるまで、この値は使用できません。あなただけのhttp.requestのように、同様のコールバックを取るためにあなたのpostCodeCheck()機能が必要になります

function postCodeCheck(callback) { 
    var pCode = { 
     host: 'geo.jamiethompson.co.uk', 
     path: "/" + 'SW1A2AA' + ".json" 
    }; 

    http.request(pCode).on('response', function(response) { 
     var data = ''; 
     response.on("data", function (chunk) { 
      data += chunk; 
     }); 
     response.on('end', function() { 
      callback(JSON.parse(data)); 
     }); 
     }).end(); 
} 

postCodeCheck(function (pCLatLng) 
{ 
    console.log(pCLatLng); 
}); 
+0

これは実際には変数を作成しません。 console.log(pCLatLng)私はちょうどテストに使用していましたが、あなたのコードを使って 'var x = postCodeCheck(function(pCLatLng){console.log(pCLatLng);})のような変数にデータを返そうとしました。 console.log(x)に移動します。まだ未定義? –

+1

あなたはまだ非同期コードを把握していないので。 '' postCodeCheck''関数は何も返さないので、 '' x''は確かに '' undefined''になります。 '' postCodeCheck''関数には、値が利用可能になると実行される関数(コールバック)が渡されます。あなたはそのコールバックの範囲外の値を取得することはできません。 –

+0

私は私がしたいと思っていることがかなり可能であると思います。私がしたいことは、郵便番号/住所を取ったNodeJSモジュールを作成することでした。 LatLngを返すが、私が次にやりたいことのために別の関数を呼び出すためには、最初に変数に行く必要がある。 (あなたの助けに感謝しなければならないでしょう)。 –

0

のようなものを試してみてください。非同期の世界では、結果を持つコールバックコールバックと同様の役割を果たします。

1

あなたはこのような何かしたい:

var http = require('http'); 

function postCodeCheck(cb) { 
    var pCode = { 
     host: 'geo.jamiethompson.co.uk', 
     path: "/" + 'SW1A2AA' + ".json" 
    }; 

    http.request(pCode).on('response', function(response) { 
     var data = ''; 
     response.on("data", function (chunk) { 
      data += chunk; 
     }); 
     response.on('end', function() { 
      var pCJSON = JSON.parse(data); 
      cb(pCJSON); 
     }); 
     }).end(); 
} 

postCodeCheck(function(pCLatLng) { console.log(pCLatLng); }); 

は、使用する前に違いを十分に確認してください。

+0

これは実際には変数を作成しませんが、console.log(pCLatLng)私はテストに使用していましたが、データを変数に戻そうとしてコードを使用していました 'var x = postCodeCheck(function(pCLatLng){console.log(pCLatLng);})'; そしてconsole.log(x)のようなものです; –