我正在尝试使用离子来查询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()
}
似乎它正在按价值更新。如何通过引用更新它?
答案 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时,这是一种非常常见的模式。数据是一直异步加载的,而回调(例如Promise
或async
/await
)是处理它的唯一方法。