如何在角度变量中存储firebase查询对象?

时间:2017-07-28 04:20:05

标签: javascript firebase firebase-realtime-database

我正在尝试使用离子来查询firebase数据库。我想将对象snapshot.val()存储在一个变量中,目的是在我的HTML代码中显示其内容,但我正在努力处理我的comingOrders变量的范围。

如何在回调中更新我的变量?

  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 个答案:

答案 0 :(得分: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
  });
}

使用现代Web API时,这是一种非常常见的模式。数据是一直异步加载的,而回调(例如Promiseasync/await)是处理它的唯一方法。