gpt4 book ai didi

javascript - 随着时间的推移,firebase 的存在变得越来越错误

转载 作者:行者123 更新时间:2023-12-03 12:46:21 25 4
gpt4 key购买 nike

我根据他们的示例为 firebase 设置了一个简单的存在用户计数。问题在于它依赖于删除断开连接的计数。然而,firebase 似乎每 2 个月就会宕机一次并删除 ondisconnect 处理程序。这意味着随着时间的推移,计数会变得越来越错误。有什么办法可以解决这个问题吗?

ty.Presence = function() {
this.rooms = {}
this.presence = fb.child('presence')
this.connectedRef = fb.child('.info/connected');
if (!localStorage.fb_presence_id) {
localStorage.fb_presence_id = Math.random().toString(36).slice(2)
}
this.browserID = localStorage.fb_presence_id
var first = false
}


ty.Presence.prototype.add = function(roomID, userobj) {
var self = this
var userListRef = this.presence.child(roomID)

// Generate a reference to a new location for my user with push.
var obj = {
s: "on",
id: this.browserID
}
if (userobj) {
obj.u = {
_id: userobj._id,
n: userobj.username
}
if (userobj.a) {
obj.u.a = userobj.a
}
}

var myUserRef = userListRef.push(obj)
this.rooms[roomID] = myUserRef
this.connectedRef.on("value", function(isOnline) {
if (isOnline.val()) {
// If we lose our internet connection, we want ourselves removed from the list.
myUserRef.onDisconnect().remove();
}
});
};

ty.Presence.prototype.count = function(roomID, cb) {
var self = this
var userListRef = this.presence.child(roomID)
var count = 0

function res () {
var usersArr = _.pluck(users, 'id')
usersArr = _.uniq(usersArr)
count = usersArr.length
if (cb) cb(count)
}

var users = {}

userListRef.on("child_added", function(css) {
users[css.name()] = css.val();
res()
});

userListRef.on("child_removed", function(css) {
delete users[css.name()]
res()
});

cb(count)
};

ty.Presence.prototype.get = function(ref) {
return this[ref]
};

ty.Presence.prototype.setGlobal = function(object) {
var self = this

_.each(this.rooms, function (myUserRef) {
myUserRef.set(object)
})
};

ty.Presence.prototype.remove = function(roomID) {
if (this.rooms[roomID])
this.rooms[roomID].remove();
};

ty.Presence.prototype.off = function(roomID) {
var userListRef = this.presence.child(roomID)
userListRef.off()
};


ty.presence = new ty.Presence()
ty.presence.add('all')

最佳答案

如果 Firebase 重新启动(例如,实时推送新版本时),onDisconnect 处理程序可能会丢失。一种简单的方法是在存储记录时附加时间戳作为记录的优先级。只要客户端保持在线,就让他偶尔更新时间戳。

setInterval(function() {
connectedRef.setPriority(Date.now());
}, 1000*60*60*4 /* every 4 hours */ );

因此,任何记录(例如 24 小时前的记录)显然都是孤儿记录。客户端(例如,当新客户端第一次收到列表时)或服务器进程(例如,带有 setInterval() 的 Node.js 脚本来检查早于 X 的记录)可能会提出质询。

presenceRef.endAt(Date.now()-24*60*60*1000 /* 24 hours ago */).remove();

当然,不太理想,但这是我在应用程序中使用过的实用解决方法。

关于javascript - 随着时间的推移,firebase 的存在变得越来越错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332954/

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