Javascript 如何使用node.js中promise函数的返回值
我想写一个函数,从node.js中的GooglePlacesAPI返回数据。该功能的定义如下所示:Javascript 如何使用node.js中promise函数的返回值,javascript,node.js,Javascript,Node.js,我想写一个函数,从node.js中的GooglePlacesAPI返回数据。该功能的定义如下所示: function getAddress(placeName) { return new Promise((resolve, reject) => { return axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').the
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)
})
那么,如何构造函数,使其返回数据呢?您正在返回axios的结果。在您解决承诺之前,获取,因此它永远不会解决问题。您应该只返回
resolve/reject
,否则您的承诺将永远无法解决(除非在返回之前调用了resolve/reject
)
承诺是一个异步概念,函数中的
return
语句是同步的。在您的示例中,newpromise(…)
分支出同步执行流,因此在Promise中生成的任何结果都不能以同步方式访问
您的函数返回一个承诺,并且在其中处理异步结果的唯一方法是使用其then
或catch
方法
长话短说,当使用异步API时,有一种特定的编码方式,它支持事件驱动的方法。考虑下面的体系结构:
var eventBus = new EventEmitter()
eventBus.on('address', (addr) => {
// do something with address
})
asyncGetAddress().then(addr => {
eventBus.emit('address', addr)
})
另请参见:return resolve(yourData)应为您提供.then函数中可用的数据。我可以使用.then函数中的数据,但我希望函数在调用时返回一个值。函数只能返回承诺,而不能返回数据。当函数返回时,数据还不可用。是否有一种方法返回数据而不是承诺?请澄清:是否有可能以这种方式获取数据:const somePlaceAddress=getAddress(('somePlace'))如果
getAddress
的结果是承诺(在您的情况下是这样的)我认为您对代码中所有return
语句的效果感到困惑。显然你希望他们做一些他们真正不做的事情。事实上,它们对你的情况没有任何影响。如果您将它们全部删除,代码将具有相同的行为(当然,返回新承诺除外)。
var eventBus = new EventEmitter()
eventBus.on('address', (addr) => {
// do something with address
})
asyncGetAddress().then(addr => {
eventBus.emit('address', addr)
})