gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:48:52 26 4
gpt4 key购买 nike

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

如果您在没有先关闭窗口的情况下关闭计算机,或者终止浏览器,有时“垃圾收集器”会执行 onDisconnect,有时则不会。

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

userRef.set('status', 1);
userRef.onDisconnect().update({ 'status' : 0 });

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

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

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

我不知道这有什么关系,但是......

我的解决方案:事实上,我刚刚错过了您了解到 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;
};

简单用例:

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

然后取消:

        if (this._onConnected) this._onConnected.cancel();
this.firebase.onDisconnect().cancel();

最佳答案

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

另请注意,在网络连接未完全终止的情况下,您可能必须等待 TCP 超时,然后我们才能检测到用户已消失并触发断开连接清理。清理将会发生,但可能需要几分钟。

关于Firebase onDisconnect 现在不是 100% 可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069672/

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