从callback函数中返回一个对象,这样一个包装函数可以返回node.js / express中的同一个对象

我正在尝试从调用第三方API的数据中返回一个对象。 我正在使用请求( https://github.com/mikeal/request )模块来完成相同的。

不过,我想从callback函数中返回这个对象。

我的请求调用是一个JavaScript函数的一部分,我希望这个外部函数能够返回新构造的对象。 由于node.js的非阻塞性质,我面临着问题,因为每当我尝试从外部函数返回对象时,由于callback函数尚未构造对象,它将返回一个空对象。

我怎样才能做到这一点?

function getData(url){ var myWeatherData = new Object(); var data; request(url, function (error, response, body) { if (!error && response.statusCode == 200) { data = JSON.parse(body); myWeatherData.locationName = data.current_observation.display_location.full; myWeatherData.weather = data.current_observation.weather; myWeatherData.temperature_string = data.current_observation.temperature_string; myWeatherData.relative_humidity = data.current_observation.relative_humidity; myWeatherData.wind_string = data.current_observation.wind_string; myWeatherData.feelslike_string = data.current_observation.feelslike_string; } return myWeatherData; // THIS IS A RETURN FROM CALL BACK }); // return myWeatherDataArr; -- THIS RETURNS AN EMPTY }; 

getData在asynchronousrequest函数调用callback之前就完成了 – 你不能从getData返回那些不存在的东西。

如果您需要一些代码来处理myWeatherData ,请将该代码作为另一个callbackgetData传递给getData

 function getData(url, callback){ request(url, function (error, response, body) { if (!error && response.statusCode == 200) { var data = JSON.parse(body); var myWeatherData = new Object(); myWeatherData.locationName = data.current_observation.display_location.full; ... myWeatherData.feelslike_string = data.current_observation.feelslike_string; callback(myWeatherData); } }); } 

为了回应你的评论,我只能重复我的答案的第一句话。 和:

 app.get('/', function(req, res){ var url = urlPrefix + myCities.state + '/' + myCities.city + '.json'; getData(url, function(aWeatherData) { res.render('index', aWeatherData); }); });