gpt4 book ai didi

javascript - 不要在 Firebase 中刷新页面时调用 onDisconnect()

转载 作者:太空宇宙 更新时间:2023-11-04 16:28:51 25 4
gpt4 key购买 nike

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

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

我创建了另一个引用来检查用户是否在线离线/在线。这里oid是其他用户的userid。

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文件中的代码被重新加载,用户在另一端看到用户离线,尽管他刚刚刷新了它。

在没有 CRON 作业的情况下,是否有任何使用 onDisconnect() 的解决方法?

最佳答案

由于 onDisconnect() 是服务器端操作,并且每次卸载页面时都会切断与服务器的连接,因此这里的简单答案是否定的:您无法阻止 onDisconnect() 在客户端关闭时触发已断开连接。

您可以做的是延迟对 onDisconnect() 事件的响应,并查看它是否在合理的阈值(例如 10 秒)内重新连接。如果没有,您可以将用户显示为离线。

更优雅的应用程序设计的第二种选择是利用 a routing tool并将您的代码转换为单页应用程序,其中不一定需要切断连接来显示新内容。

关于javascript - 不要在 Firebase 中刷新页面时调用 onDisconnect(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com