The .info/connected
状态数据仅告诉给定客户端它们是否链接到 Firebase 服务器,因此在这种情况下它不会为您提供帮助。您可以尝试以下其中一项:
如果变量离线则重置变量
如果您有多个客户端监视同一变量(多个窗口属于此类),那么很自然地会期望它们在存在值方面发生冲突。让每个人监视变量的变化并根据需要进行纠正。
var ref = firebaseRef.child(MY_ID).child('status');
ref.onDisconnect().remove();
ref.on('value', function(ss) {
if( ss.val() !== 'online' ) {
// another window went offline, so mark me still online
ss.ref().set('online');
}
});
这既快速又容易实现,但可能会很烦人,因为我的状态可能会闪烁到离线状态,然后为其他客户端返回在线状态。当然,这可以通过在任何更改事件触发 UI 更新之前短暂延迟来解决。
为每个连接提供自己的路径
由于该目的onDisconnect
是告诉你如果某个特定的客户端离线了,那么我们自然应该给每个客户端一个自己的连接:
var ref = firebaseRef.child(MY_ID).child('status').push(1);
ref.onDisconnect().remove();
在这个用例中,每个连接的客户端都会在下面添加一个新的子客户端status
。如果路径不为空,则至少有一个客户端已连接。
实际上,通过查找真实值来检查在线状态非常简单status
:
firebaseRef.child(USER_ID).child('status').on('value', function(ss) {
var isOnline = ss.val() !== null;
});
这样做的一个缺点是你实际上只有一个真实值status
(你不能将其设置为“空闲”与“在线”之类的东西),尽管这也可以通过一点点聪明才智来解决。
在这种情况下交易不起作用
我的第一个想法是尝试一个事务,这样你就可以在每个窗口打开/关闭时增加/减少一个计数器,但似乎没有transaction
方法关闭onDisconnect
事件。这就是我提出多路径存在值的方法。