为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

肥皂起泡泡 2021-06-11 14:01:53
首先,我知道这里已经有很多关于异步的东西,但是我在很多地方都看过了,但没有找到任何似乎可以回答这个特定问题的东西,至少对于这个菜鸟未经训练的眼睛来说是这样。背景我有一个函数foo依赖于另一个函数的结果,googlePlaces其中包含了一个承诺,但整体功能是不是一个承诺。JSvar 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)我可以将foo第 69 行之后的所有内容都移到googlePlaces函数内,这可行,但是为了代码的整洁性和可读性,如果它可以保留在foo
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

在googlePlaces()做:


return googleMapsClient.placesNearby(request).asPromise();


然后在foo()做:


async function foo(){

  ...    

  var results = await googlePlaces(point);

  results.then( /* do you then stuff here */);

}


查看完整回答
反对 回复 2021-06-18
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

如果您确定 foo 返回一个承诺,请承诺它与 then 链接:


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..

})


查看完整回答
反对 回复 2021-06-18
?
郎朗坤

TA贡献1921条经验 获得超9个赞

无需过多更改代码,您就可以将 google 位置承诺包装在另一个冒泡到 foo() 的承诺中。从那里你可以处理结果。


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);

           })

    });

}


查看完整回答
反对 回复 2021-06-18
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信