我們正在編寫一個應用程序來監視在線狀態。有多種場景需要用戶打開多個瀏覽器窗口。我們遇到了一個問題,用戶在輔助瀏覽器窗口中打開並運行firebase js代碼後,會關閉該輔助窗口。這會在主窗口中將其存在設置爲脫機,因爲onDisconnect事件在輔助窗口中觸發。Firebase持久性 - onDisconnect與多個瀏覽器窗口
是否有解決此方案的解決方法?這是特殊的/.info/連接的位置可以使用嗎?
我們正在編寫一個應用程序來監視在線狀態。有多種場景需要用戶打開多個瀏覽器窗口。我們遇到了一個問題,用戶在輔助瀏覽器窗口中打開並運行firebase js代碼後,會關閉該輔助窗口。這會在主窗口中將其存在設置爲脫機,因爲onDisconnect事件在輔助窗口中觸發。Firebase持久性 - onDisconnect與多個瀏覽器窗口
是否有解決此方案的解決方法?這是特殊的/.info/連接的位置可以使用嗎?
.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
事件。所以這就是我提出的多路徑存在值。
另一種簡單的解決方案(使用angularfire2,但使用純火力是相似的):
const objRef = this.af.database.list('/users/' + user_id);
const elRef = objRef.push(1);
elRef.onDisconnect().remove();
每當一個新的選項卡被打開的新元素被添加到陣列中。 「onDisconnect」的引用是與新元素相關的,只有它被排除。
當該數組爲空時,用戶將離線。
thnx @Kato!我解決方案#1:重置變量,如果它離線。奇蹟般有效。用戶關閉輔助瀏覽器時的輕微閃爍對我們來說並不是什麼大問題。 – 2013-05-09 19:38:19