2012-02-17 80 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