gpt4 book ai didi

javascript - 如何计算符合特定条件的 Firebase 子项目

转载 作者:行者123 更新时间:2023-11-28 04:48:21 28 4
gpt4 key购买 nike

对于每个用户帐户,我尝试计算他们今天有多少个事件。

我的数据结构如下:

accounts -
{
"-KaxcGWx1-a8s7dhsjhsd" : {
"name" : "Bill",
"events" : [ {
"event" : "-KdHscYor4mA--ubIHBj"
}, {
"event" : "-KdKsJBdHimgPPQQ6bcA"
} ],
},
"-KaxcGWx1-rA2anjKI4h" : {
"name" : "Bob",
"username" : "Bob"
"events" : [ {
"event" : "-KdHscYor4mA--ubIHBj"
}]
}
}


events -
{
"-KdHscYor4mA--ubIHBj" : {
"dateCreated" : "Fri Feb 17 2017 23:37:32 GMT+0000 (GMT)",
"eventDate" : "2017-04-01",
"name" : "Event 1",
},
"-KdKsJBdHimgPPQQ6bcA" : {
"dateCreated" : "Fri Feb 17 2017 23:37:32 GMT+0000 (GMT)",
"eventDate" : "2017-04-01",
"name" : "Event 2",
}
}

鉴于这两项事件都在今天举行。我希望比尔有两个,鲍勃有一个。

我尝试过的代码是:

var todayDate = '2017-04-01';
var ref = firebase.database().ref('accounts/');
ref.once('value', function (snapshot) {
//Foreach user account
var eventCount = 0;
snapshot.forEach(function (account) {
var ref = firebase.database().ref('accounts/' + account.key);
ref.child('events').once('value', function (eventSnapshot) {
//Foreach event
eventSnapshot.forEach(function (child) {
firebase.database().ref('events/' + child.val().event).once('value', function (event) {
if (eventDate === todayDate) {
console.log(account.val().name, 'has an event today -', event.val().name);
eventCount++;
}
});
});
});
console.log(account.val().name, 'total events -', eventCount);
});
});

但是,我在控制台中得到的结果是:

Bill total events - 0
Bob total events - 0
Bill has an event today Event 1
Bill has an event today Event 2
Bob has an event today Event 2

最佳答案

问题出在代码的一般结构上。您深度嵌套对 ref.once('value') 的调用,并期望它们全部同步执行。然而,once() 是异步的。该函数总是立即返回 - 它不等待快照。稍后,只要数据可用,就会使用快照调用您的回调。这意味着您的 foreach 循环正在迭代快照的每个子级,并在调用任何快照回调之前完成。这会导致您的计数为 0。

您将需要以事件驱动的异步方式完全重构代码,而不是现在的过程同步方式。

关于javascript - 如何计算符合特定条件的 Firebase 子项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162186/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com