Я использую Firebase широко и по-прежнему сталкиваюсь только с одной реальной проблемой: onDisconnect не на 100% надежна в моем опыте.
Если вы закрываете компьютер, не закрывая сначала окно, или убиваете браузер, у вас когда-нибудь есть "сборщик мусора", который запускает ваш onDisconnect, иногда это не так.
Мой вопрос заключается в следующем: я просто не использую /.connected на данный момент, я в основном использую простой
userRef.set('status', 1);
userRef.onDisconnect().update({ 'status' : 0 });
Что-то не так с этим подходом? Согласны ли мы с тем, что параметры обновления передаются на сервер во время выполнения строки, а не до выгрузки окна?
NB: Я пытаюсь сохранить статус нескольких окон, используя следующий подход, чтобы сохранить статус в 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();