我正确使用ForEach吗?

时间:2014-11-28 04:01:37

标签: firebase

我正在使用以下布局在firebase中处理类似状态的系统:

firebase {
   user1 {
     isOnline: true
   }
   user 2 {
     isOnline: true
   }
   user3 {
     isOnline: false
   }
}

isOnline booleans是我稍后将用于输出在线用户名到控制台的用途

例如,在上面的情况中,它会说:

user1 is online.
user2 is online.

这是我的代码:

var gameRef = new Firebase("https://xxx.firebaseio.com/");
var userOnline = new Firebase('https://xxx/.info/connected');

        userOnline.on('value', function (snapshot) {
          if (snapshot.val()) {
               gameRef.child(user).update({
                    isOnline : true
                });
          }
          else {
              gameRef.child(user).update({
                    isOnline : false
                });
          }
        });

       // for each user that is online, output to the console
       gameRef.forEach(function (snapshot) {
            var obj = snapshot.val();
            if(obj.isOnline == true) {
                console.log(obj.name + " is online.");
            }
        }); 

我的forEach似乎有问题,我该如何解决这个问题? 感谢。

1 个答案:

答案 0 :(得分:13)

你不能forEach覆盖参考,而只能覆盖快照。

   // for each user that is online, output to the console
   gameRef.on('value', function(function(gamesSnapshot) {
       gamesSnapshot.forEach(function (snapshot) {
           var obj = snapshot.val();
           if(obj.isOnline == true) {
               console.log(obj.name + " is online.");
           }
       }
   }); 

此代码有两个快照变量:

  • gameSnapshot是父节点中的数据
  • snapshot是特定玩家的数据

替代

上述方法将下载所有玩家,即使您只是想与在线玩家打交道。在这种情况下,查询Firebase以使其仅返回在线玩家时效率更高。

   // for each user that is online, output to the console
   var onlinePlayers = gameRef.orderByChild('isOnline').equalTo(true);
   onlinePlayers.on('child_added', function(function(snapshot) {
       var obj = snapshot.val();
       if(obj.isOnline == true) {
           console.log(obj.name + " is online.");
       }
   }); 

现在,代码会侦听child_added事件,因为Firebase会一次向玩家提供一个勺子。将玩家映射到HTML元素后,您可能还需要处理child_changedchild_removed

即使这会产生更多代码,我通常会建议使用查询和child_*事件,因为它们会限制Firebase最初发送给您的数据,例如玩家离线。