亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何等待對不是承諾但包含承諾的函數的調用結果?

如何等待對不是承諾但包含承諾的函數的調用結果?

肥皂起泡泡 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 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號