2017-07-28 83 views
2

我正在嘗試使用離子對一個Firebase數據庫進行查詢。我想將對象snapshot.val()存儲在一個變量中,目標是在我的HTML代碼中顯示其內容,但是我正在爲即將到來的變量的範圍掙扎。如何將角色中的Firebase查詢對象存儲在變量中?

如何更新回調中的變量?

onFetchMyUpcomingOrders(){ 
    var upcomingOrders = {} 
    const userId = this.authService.getActiveUser().uid; 
    var ref = firebase.database().ref("orders/confirmed"); 
    ref.orderByChild("client/clientId").equalTo(userId).once("value", (snapshot) => { 
     upcomingOrders= snapshot.val() 
     console.log(upcomingOrders) 
     }); 
    console.log(upcomingOrders) // Empty object, should contain snapshot.val() 
    } 

看起來好像是按值更新。我如何通過參考來更新它?

回答

1

數據是從Firebase異步加載的。當數據被加載時,該功能繼續運行。在函數結束之前執行console.log()時,數據尚未加載。然後當數據變得可用時,調用你的回調函數。

因此:你的upcomingOrders變量被設置正確,只是不在你目前想要它的時刻。

要使此代碼正常工作,您必須將需要數據的所有代碼移動到的回調函數中。所以,如果你要更新的HTML,你這樣做,從回調:

onFetchMyUpcomingOrders(){ 
    var upcomingOrders = {} 
    const userId = this.authService.getActiveUser().uid; 
    var ref = firebase.database().ref("orders/confirmed"); 
    ref.orderByChild("client/clientId").equalTo(userId).once("value", (snapshot) => { 
    upcomingOrders= snapshot.val() 
    // TODO: update HTML and do whatever else needs the data 
    }); 
} 

利用現代網絡的API時,這是一種極爲常見的模式。數據一直是異步加載的,像這樣的回調(或者更現代的等價物如Promiseasync/await)是處理它的唯一方法。

相關問題