Во-первых, я знаю, что здесь уже есть много информации об асинхронности, но я смотрел во многих местах, включая и выключая SO, и не нашел ничего, что, по-видимому, отвечает на этот конкретный вопрос, по крайней мере, для неподготовленных глаз этогонуб.
Фон
У меня есть функция foo
, которая зависит от результата другой функции googlePlaces
, которая содержит обещание, но общая функция не является обещанием.
JS
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
undefined
конец функции 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)
Я могу переместить все из foo
после строки 69 в функцию googlePlaces
, и это работает, но для аккуратности и читабельности кода было бы намного лучше, если бы он мог остаться в foo