在将其返回值分配给其他JS文件中的变量之前,如何等待module.export函数完成请求

时间:2019-02-26 21:24:31

标签: javascript node.js promise async-await xmlhttprequest

我在Node.js应用程序中运行了两个JS文件。

在latlng.js中,我有以下代码:

async function getPlaceDetails(input) {

  var locationUrl = 'https://www.google.com';

  request(locationUrl, (error, response, body) => {
    if (!error && response.statusCode == 200) {
      let location_json = JSON.parse(body);
      let placeDetails = {
        lat: location_json.candidates[0].geometry.location.lat,
        lng: location_json.candidates[0].geometry.location.lng,
        name: location_json.candidates[0].name,
      }

      return placeDetails;
    }
    else {
      console.log("Error "+response.statusCode);
    }
  });
}

module.exports.getPlaceDetails = getPlaceDetails;

我正在从latlng.js中导出功能getPlaceDetails(),以便可以在app.js中使用它,请参见此处:

var place = require('./latlng');

async function firstFunction(input){
    let data = await place.getPlaceDetails(input);
    return data;
};

async function secondFunction(input){
    let data = await firstFunction(input);
    // now wait for firstFunction to finish...
    console.log(data);
};

secondFunction('museum of modern art');

这为我返回未定义。我今天一直在寻找几个小时,以获取除undefined或Promise {undefined}之外的其他东西,但没有成功...

1 个答案:

答案 0 :(得分:0)

您的getPlaceDetails函数是基于回调的,当您await没有回调时,它不会立即返回有用的任何东西。相反,您可以“承诺”它以适应async/await模式:

async function getPlaceDetails(input) {

 return new Promise((resolve, reject) => {
    var locationUrl = 'https://www.google.com';

    request(locationUrl, (error, response, body) => {
      if (!error && response.statusCode == 200) {
        let location_json = JSON.parse(body);
        let placeDetails = {
          lat: location_json.candidates[0].geometry.location.lat,
          lng: location_json.candidates[0].geometry.location.lng,
          name: location_json.candidates[0].name,
        }

        resolve(placeDetails);
      }
      else {
        console.log("Error "+response.statusCode);
        reject(new Error('something meaningful here'));
      }
    });
  });
}

module.exports.getPlaceDetails = getPlaceDetails;