2017-07-21 72 views
1

我想編寫一個函數,它可以從node.js中的google places API返回數據。該功能定義如下所示:如何在node.js中使用promise函數的返回值

function getAddress(placeName) { 
    return new Promise((resolve, reject) => { 
    return axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').then(response => { 
     const placeID = response.data.results[0].place_id 
     return axios.get('https://maps.googleapis.com/maps/api/place/details/json?placeid=' + placeID + '&key=MyAPIKey').then(response => { 
      resolve(response.data.result) 
      return response.data.result // here i would like to return the data.result 
     }).catch(err => { 
      console.error(err); 
     }); 
    }).catch(err => { 
     reject(err); 
    }); 
    }); 
} 

我想使用該函數並獲取返回值。我曾嘗試用下面的代碼,但我得到的錯誤「無極掛起」

const address = getAddress('someName').then(address => { 
    phone: address.formatted_phone_number 
    }).catch(err => { 
    console.error(err) 
    }) 

那麼,如何構造函數,所以它返回的數據?

+0

回報的決心(yourData)應該讓你的。那麼函數可用 – yBrodsky

+0

我可以在函數。然後將數據的工作數據,但我要求函數在調用時返回一個值 – john

+0

該函數只能返回promise,而不是數據。當函數返回時數據不可用。 – jfriend00

回答

0

Promise是一個異步概念,return函數中的語句是同步的。在你的例子中,new Promise(...)分支出同步執行流程,所以在promise中產生的任何結果都不能以同步方式訪問。

您的函數返回一個承諾,並且處理異步結果的唯一方法是使用其thencatch方法。長話短說,使用異步API時有一定的編碼方式,這有利於事件驅動的方法。請看下面的架構:

var eventBus = new EventEmitter() 

eventBus.on('address', (addr) => { 
    // do something with address 
}) 

asyncGetAddress().then(addr => { 
    eventBus.emit('address', addr) 
}) 

參見:https://nodejs.org/api/events.html

+0

只需清楚一點:以任何方式都可以以這種方式獲取數據: const somePlaceAddress = getAddress(('somePlace')) – john

+0

如果'getAddress'的結果是promise(並且它處於你的情況) – krukid

+0

我認爲你被代碼中所有'return'語句的影響所困惑。顯然你期望他們做一些他們真正不需要的東西。事實上,他們對你的案件沒有任何影響。如果你完全刪除它們,代碼將具有相同的行爲(當然,除了'return new Promise'外)。 – krukid

1

在您解決您的承諾之前,您將返回axios.get的結果,因此無法解決。你應該只返回resolve/reject,其他任何事情,你的承諾永遠不會解決(除非你回來之前調用resolve/reject)。

function getAddress(placeName) { 
    return new Promise((resolve, reject) => { 
    axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').then(response => { 
     const placeID = response.data.results[0].place_id 
     axios.get('https://maps.googleapis.com/maps/api/place/details/json?placeid=' + placeID + '&key=MyAPIKey').then(response => { 
      return resolve(response.data.result) 
     }).catch(err => { 
      return reject(err) 
     }); 
    }).catch(err => { 
     return reject(err); 
    }); 
    }); 
} 
相關問題