首先,我知道这里已经有很多关于异步的东西,但是我已经遍历了很多地方,却没有发现任何似乎可以回答这个特定问题的东西,至少对于未经培训的人而言菜鸟。
我有一个函数foo
,它取决于另一个函数googlePlaces
的结果,该函数包含一个承诺,但整个功能不是一个承诺。
var googleMapsClient = require('@google/maps').createClient({
key: <API_KEY>
Promise: Promise
});
...
function foo() {
var point = [49.215369,2.627365]
var results = googlePlaces(point)
console.log('line 69')
console.log(results)
// do some more stuff with 'results'
}
function googlePlaces(point) {
var placesOfInterest = [];
var latLng = (point[0]+','+point[1])
var request = {
location: latLng,
radius: 10000
};
googleMapsClient.placesNearby(request).asPromise()
.then(function(response){
placesOfInterest.push(response.json.results)
})
.finally(function(){
console.log('end of googlePlaces function:')
console.log(placesOfInterest);
return(placesOfInterest);
})
}
第69行
未定义
googlePlaces函数的结尾
[我可爱的阵列]
我尝试使foo
成为异步函数,并将results
更改为= await googlePlaces(point)
,但是我仍然不确定,它还会抛出UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
我可以将第69行之后的所有内容从foo
移到googlePlaces
函数中,并且可以,但是为了代码的简洁和可读性,如果将其保留在{{ 1}}
答案 0 :(得分:3)
在googlePlaces()
中执行:
return googleMapsClient.placesNearby(request).asPromise();
然后在foo()
中执行以下操作:
async function foo(){
...
var results = await googlePlaces(point);
results.then( /* do you then stuff here */);
}
答案 1 :(得分:0)
如果您确定foo返回了诺言,则将其Promisfy与之链接:
function foo() {
var point = [49.215369,2.627365]
var results = googlePlaces(point)
return results;
}
(new Promise(function(res){
res(foo());
})).then(function(result){
//do something with result..
})
答案 2 :(得分:0)
无需过多更改代码,您可以将Google Places Prom包装在另一个由foo()组成的Promise中。从那里您可以处理结果。
function foo() {
var point = [49.215369,2.627365]
var promise = googlePlaces(point)
promise.then((results) => {
// do stuff with 'results'
console.log(results)
});
}
function googlePlaces(point) {
var placesOfInterest = [];
var latLng = (point[0]+','+point[1])
var request = {
location: latLng,
radius: 10000
};
return new Promise((resolve) => {
googleMapsClient.placesNearby(request).asPromise();
.then(function(response){
placesOfInterest.push(response.json.results)
})
.finally(function(){
console.log('end of googlePlaces function:')
console.log(placesOfInterest);
// resolve the promise
resolve(placesOfInterest);
})
});
}