Firebase onDisconnect现在不是100%可靠吗?

cwe*_*ung 11 firebase

我一直在广泛使用Firebase,但仍然只面临一个真正的问题:根据我的经验,onDisconnect并非100%可靠.

如果你在没有先关闭窗口的情况下关闭计算机,或者杀死浏览器,你有时会让"垃圾收集器"执行你的onDisconnect,有时却没有.

我的问题如下:我现在只是不使用/.connected,我基本上使用简单

userRef.set('status', 1);
userRef.onDisconnect().update({ 'status' : 0 });
Run Code Online (Sandbox Code Playgroud)

这种方法有什么问题吗?我们是否同意更新参数在执行行时而不是在窗口卸载之前传递给服务器?

注意:我碰巧尝试保持多窗口状态,如果另一个窗口关闭,使用以下方法将状态保持为1:

userRef.child('status').on('value', function(snap) {
  if (snap.val() != 1) {
    userRef.set('status', 1);
  }
});
Run Code Online (Sandbox Code Playgroud)

我不知道这是如何相关的,但......

我的解决方案:事实上,我刚刚错过了您了解onDisconnect只触发一次的部分.要获得持久性onDisconnect,您需要实现基本持久性.

Helpers.onConnected = function(callback) {
    var connectedRef = lm.newFirebase('.info/connected');
    var fn =  connectedRef.on('value', function(snap) {
      if (snap.val() === true) {
          if (callback) callback();
      }
    });
    var returned = {};
    returned.cancel = function() {
        connectedRef.off('value', fn);
    };
    return returned;
};       
Run Code Online (Sandbox Code Playgroud)

简单的用例:

        this._onConnected = lm.helpers.onConnected(function() {
            this.firebase.onDisconnect().update({ 'tu': 0 });
        }.bind(this));
Run Code Online (Sandbox Code Playgroud)

然后取消:

        if (this._onConnected) this._onConnected.cancel();
        this.firebase.onDisconnect().cancel();
Run Code Online (Sandbox Code Playgroud)

And*_*Lee 5

在调用set()操作之前,应始终调用onDisconnect()操作.这样,如果两者之间的连接丢失,你就不会得到僵尸数据了.

另请注意,在网络连接未被彻底清除的情况下,您可能必须等待TCP超时才能检测到用户已离开并触发断开连接清除.将进行清理,但可能需要几分钟.

  • 这就是我们提供/.info/connected端点的原因.我们建议每次连接重新联机时重新建立断开处理程序.请参阅此处的最后一个代码段:https://www.firebase.com/docs/managing-presence.html (5认同)
  • 安德鲁,我终于找到了我的问题的根源.我的错误:我从未真正意识到onDisconnect只是在您第一次断开连接时被调用.这解释了我们所有的错误...我肯定会在你的网站上用红色+粗体. (4认同)
  • 问题是我仍然得到大约20%的onDisconnect,它不会被遗忘,导致人们看起来永远连接起来.您是否知道如何理解正在发生的事情,因为它100%确定在调用onDisconnect时至少还有几分钟的连接? (2认同)