1

我正在尝试返回一个对象,该对象是从调用第三方 API 获得的数据中构建的。我正在使用请求(https://github.com/mikeal/request ) 模块来完成同样的任务。

但是,我想从回调函数中返回这个对象。

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

我怎样才能做到这一点?

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 
};
4

1 回答 1

5

getData在异步函数调用回调之前完成request- 您不能从getData尚不存在的东西返回。

如果您需要使用一些代码myWeatherData,请将该代码作为另一个回调传递给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); 
  });
});
于 2014-08-26T16:23:50.267 回答