我想编写一个函数,从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)
})
那么我如何构造函数,所以它返回数据?
答案 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中生成的任何结果。
您的函数返回一个承诺,并且使用其then
或catch
方法处理异步结果的唯一方法。
长话短说,在使用异步API时有一定的编码方式,这有利于事件驱动的方法。请考虑以下架构:
var eventBus = new EventEmitter()
eventBus.on('address', (addr) => {
// do something with address
})
asyncGetAddress().then(addr => {
eventBus.emit('address', addr)
})