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

我想编写一个函数,从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) }) 

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

Promise是一个asynchronous的概念,函数中的return语句是同步的。 在您的示例中, new Promise(...)分支不在同步执行stream程中,因此无论在promise中产生的结果都无法以同步方式访问。

您的函数返回一个承诺,并在其中使用asynchronous结果的唯一方法是使用其thencatch方法。

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

 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

在你解决你的诺言之前,你正在返回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); }); }); }