2013-06-12 77 views
8

我一直在廣泛使用Firebase,並且仍然只面臨一個實際問題:onDisconnect在我的經驗中不是100%可靠的。現在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(); 

回答

5

你應該總是調用onDisconnect()操作之前調用集()操作。這樣,如果兩者之間的連接丟失,則不會以殭屍數據結束。

另請注意,在網絡連接並未徹底終止的情況下,您可能必須等待TCP超時,然後才能檢測到用戶已消失並觸發斷開連接清理。清理將會發生,但可能需要幾分鐘的時間。

+2

問題是,我仍然得到約20%的onDisconnect,它永遠不會被調用,導致人們看起來永遠連接在一起。您是否有任何想法瞭解發生了什麼,因爲100%確定在調用onDisconnect時至少有幾分鐘的連接? – cwehrung

+1

客戶端斷開連接後等待多久?在某些極端情況下可能需要5分鐘。另外 - 你也許有安全規則阻止斷開連接操作? 測試用例也會有幫助。你有超級簡單測試用例的鏈接嗎? –

+3

安德魯,我終於找到了我的問題的來源。我的錯誤:我從未真正意識到onDisconnect僅在您第一次斷開連接時才被調用。這解釋了我們所有的錯誤......我一定會在您的網站上以紅色+粗體顯示。 – cwehrung