我已使用此代码更新了当前登录用户的在线/离线状态,其中z是用户ID。

var ref = firebase.database().ref("users/"+z);
    ref.update({
       online: "1"
    });
    ref.onDisconnect().update({
      online: "0"
    });


我创建了另一个参考,该参考检查用户是否在线/离线。这里的oid是其他用户的用户ID。

db = firebase.database().ref().child("users/"+oid);
       db.on('value', function(snapShot){
          var data = snapShot.val();
          if(data.online === "0")
          {
              var lastvisible = getTime(data.lastvisibleat);
              var div = $("[data-conli-id="+cid+"]");
              if(div.hasClass('online'))
              {
                  div.removeClass('online');
                  div.addClass('offline');
                  div.find("#user-status-li").attr("data-lv", lastvisible);
              }
              else if(div.hasClass('offline'))
              {
                  div.find("#user-status-li").attr("data-lv", lastvisible);
              }
              var chat_box_div = $("#chat-box-"+cid);
              if(chat_box_div)
              {
                  var user_status_div = chat_box_div.find("#user-status");
                  if(user_status_div.text() === 'online')
                  {
                     user_status_div.text('offline');

                     user_status_div.text(lastvisible+" ago");
                  }
              }
          }
          else if(data.online === "1")
          {
              var div = $("[data-conli-id="+cid+"]");
              if(div.hasClass('offline'))
              {
                  div.removeClass('offline');
                  div.addClass('online');
              }
              var chat_box_div = $("#chat-box-"+cid);
              if(chat_box_div)
              {
                  var user_status_div = chat_box_div.find("#user-status");
                  if(user_status_div.text() === 'offline' || user_status_div.text() !== 'online')
                  {
                     user_status_div.text('online');
                  }
              }
          }
       });


这对我来说很好。如果浏览器崩溃或互联网消失,或者用户注销。问题是当用户刷新当前页面或导航到另一页面时。

此代码位于JS文件中,已重新加载,并且用户在另一侧看到用户已脱机,尽管他刚刚对其进行了刷新。

onDisconnect()有没有CRON工作的解决方法?

最佳答案

由于onDisconnect()是服务器端的操作,并且在每次卸载页面时都会断开与服务器的连接,因此这里的简单答案是“否”:您不能防止在客户端断开连接时触发onDisconnect()。

相反,您可以做的是延迟对onDisconnect()事件的响应,并查看它是否在合理的阈值(例如10秒)内重新连接。如果不是,则可以将用户显示为脱机状态。

更优雅的应用程序设计的第二种替代方法是利用a routing tool并将代码转换为单页应用程序,在该应用程序中不必断开连接以显示新内容。

07-22 16:43