2012-02-17 85 views
3

嗨,現在我知道NodeJS是異步的(我仍然試圖讓我的頭說實話)。NodeJS返回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); 

這顯然是輸出「不確定」;我已經嘗試在返回「hi」或其中的任何內容時返回response.on('end'),而不是NodeJS輸出有關該站點的信息。如果任何人都可以幫助這一點,將不勝感激。

回答

5

console.log(pCLatLng);需要在response.on('end'回調內部(或內部調用)。該值在該回調被觸發之前不可用。

試着這麼做:

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);它仍然沒有定義? – 2012-02-17 18:28:24

+1

因爲你還沒有掌握異步代碼。 ''postCodeCheck'函數不返回任何東西,所以''x''肯定會是''undefined''。 postCodeCheck函數傳遞一個函數(回調函數),一旦該值可用,該函數就會被執行。您*無法*獲得該回調範圍之外的值。 – 2012-02-17 18:59:43

+0

我看到我不認爲我想要做的事很有可能。我想要做的是創建一個帶有郵政編碼/地址的NodeJS模塊;並返回LatLng,但它需要先去一個變量,以便爲下一步我要做的事情發射另一個函數。 (將不得不重新考慮那一個,然後感謝您的幫助)。 – 2012-02-17 19:51:08

0

你需要你的postCodeCheck()功能採取回調爲好,就像http.request。在異步世界中,使用結果調用回調與結果的作用類似。

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);它仍然狀態未定義? – 2012-02-17 18:19:44