我已使用此代码更新了当前登录用户的在线/离线状态,其中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并将代码转换为单页应用程序,在该应用程序中不必断开连接以显示新内容。