13

私は Firebase を広範囲に使用してきましたが、まだ 1 つだけ実際の問題に直面しています。私の経験では、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 が 1 回だけトリガーされることを学ぶ部分を見逃していました。永続的な 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();
4

3 に答える 3