2013-05-08 43 views
4

我們正在編寫一個應用程序來監視在線狀態。有多種場景需要用戶打開多個瀏覽器窗口。我們遇到了一個問題,用戶在輔助瀏覽器窗口中打開並運行firebase js代碼後,會關閉該輔助窗口。這會在主窗口中將其存在設置爲脫機,因爲onDisconnect事件在輔助窗口中觸發。Firebase持久性 - onDisconnect與多個瀏覽器窗口

是否有解決此方案的解決方法?這是特殊的/.info/連接的位置可以使用嗎?

回答

7

.info/connected presence數據只告訴給定的客戶端它們是否鏈接到Firebase服務器,因此在這種情況下它不會對您有所幫助。你可以嘗試下列操作之一:

復位變量,如果如果你有多個客戶端監控相同的變量(多窗口屬於這一類),它下線

,是很自然的想到他們發生衝突有關存在值。讓每個人都監視變量的變化並根據需要進行更正。

var ref = firebaseRef.child(MY_ID).child('status'); 
ref.onDisconnect().remove(); 
ref.on('value', function(ss) { 
    if(ss.val() !== 'online') { 
     // another window went offline, so mark me still online 
     ss.ref().set('online'); 
    } 
}); 

這是速度快,易於實現,但可能是因爲討厭我的狀態可能會閃爍爲脫機,然後重新聯機爲其他客戶。當然,這可以通過在觸發UI更新之前對任何更改事件進行短暫延遲來解決。

給每個連接自己的路

由於onDisconnect的目的是要告訴你,如果一個特定的客戶端離線,那麼我們自然應該給每個客戶自己的連接:

var ref = firebaseRef.child(MY_ID).child('status').push(1); 
ref.onDisconnect().remove(); 

有了這個用例,每個連接的客戶端都會在status下添加一個新的子項。如果路徑不爲空,則至少有一個客戶端連接。

它實際上是相當簡單的通過只是在status尋找truthy值來檢查的在線狀態:

firebaseRef.child(USER_ID).child('status').on('value', function(ss) { 
    var isOnline = ss.val() !== null; 
}); 

這樣做的缺點是,你真的只對status一個thruthy值(也可以不將其設置爲「閒置」與「在線」之類的東西),儘管這也可以用一點巧妙的方法解決。

的交易不在這種情況下工作

我首先想到的是去嘗試交易,因此,當打開/關閉每個窗口,你可以增/減計數器,但似乎並不成爲transaction方法關閉onDisconnect事件。所以這就是我提出的多路徑存在值。

+0

thnx @Kato!我解決方案#1:重置變量,如果它離線。奇蹟般有效。用戶關閉輔助瀏覽器時的輕微閃爍對我們來說並不是什麼大問題。 – 2013-05-09 19:38:19

0

另一種簡單的解決方案(使用angularfire2,但使用純火力是相似的):

const objRef = this.af.database.list('/users/' + user_id); 
const elRef = objRef.push(1); 
elRef.onDisconnect().remove(); 

每當一個新的選項卡被打開的新元素被添加到陣列中。 「onDisconnect」的引用是與新元素相關的,只有它被排除。

當該數組爲空時,用戶將離線。