我正在使用以下布局在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似乎有问题,我该如何解决这个问题? 感谢。
答案 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_changed
和child_removed
。
即使这会产生更多代码,我通常会建议使用查询和child_*
事件,因为它们会限制Firebase最初发送给您的数据,例如玩家离线。