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

标签 javascript firebase firebase-realtime-database

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

我的数据结构如下:

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/

相关文章:

javascript - 根据对象中字段的存在对数组进行排序

javascript - 如何使用 JQUERY 删除禁用元素?

android - debugview firebase 中没有可用的设备

javascript - Firebase 函数 : Cannot read property 'val' of undefined

java - 单击 recyclerView 中的下一个按钮后加载下一个项目

javascript - Jade 复选框选中属性未选中基于条件(如果)

php - 如何将 JavaScript 变量传递给 PHP?

javascript - 为什么 firestore/AngularFire SDK 将多个 promise 打包到一个请求中?

ios - 获取文件上传者的UID

javascript - Firebase - 读取特定文档时是否可以执行云功能?