如何等待不是promise但包含promise的函数的调用结果?

时间:2019-06-03 21:06:58

标签: javascript async-await

首先,我知道这里已经有很多关于异步的东西,但是我已经遍历了很多地方,却没有发现任何似乎可以回答这个特定问题的东西,至少对于未经培训的人而言菜鸟。

背景

我有一个函数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行
未定义
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}}

3 个答案:

答案 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);
           })
    });
}