如何在node.js中使用promise函数的返回值

时间:2017-07-21 16:47:06

标签: javascript node.js

我想编写一个函数,从node.js中的google places API返回数据。该功能定义如下:

function getAddress(placeName) {
  return new Promise((resolve, reject) => {
    return axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').then(response => {
      const placeID = response.data.results[0].place_id
       return axios.get('https://maps.googleapis.com/maps/api/place/details/json?placeid=' + placeID + '&key=MyAPIKey').then(response => {
          resolve(response.data.result)
          return response.data.result // here i would like to return the data.result
        }).catch(err => {
          console.error(err);
        });
    }).catch(err => {
      reject(err);
    });
  });
}

我想使用该函数并获取返回值。我已尝试使用下面的代码,但我收到了错误' Promise pending'

const address = getAddress('someName').then(address => {
    phone: address.formatted_phone_number
  }).catch(err => {
    console.error(err)
  })

那么我如何构造函数,所以它返回数据?

2 个答案:

答案 0 :(得分:1)

在您解决承诺之前,您将返回axios.get的结果,因此它永远无法解决。您应该只返回resolve/reject,其他任何内容都不会解决(除非在您返回之前调用resolve/reject)。

function getAddress(placeName) {
  return new Promise((resolve, reject) => {
    axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').then(response => {
      const placeID = response.data.results[0].place_id
       axios.get('https://maps.googleapis.com/maps/api/place/details/json?placeid=' + placeID + '&key=MyAPIKey').then(response => {
          return resolve(response.data.result)
        }).catch(err => {
          return reject(err)
        });
    }).catch(err => {
      return reject(err);
    });
  });
}

答案 1 :(得分:0)

Promise是一个异步概念,函数中的return语句是同步的。在您的示例中new Promise(...)分支出同步执行流,因此无法以同步方式访问promise中生成的任何结果。

您的函数返回一个承诺,并且使用其thencatch方法处理异步结果的唯一方法。

长话短说,在使用异步API时有一定的编码方式,这有利于事件驱动的方法。请考虑以下架构:

var eventBus = new EventEmitter()

eventBus.on('address', (addr) => {
  // do something with address
})

asyncGetAddress().then(addr => {
  eventBus.emit('address', addr)
})

另请参阅:https://nodejs.org/api/events.html