2014-07-15 83 views
4

我注意到當我設置onDisconnect(),在不同的計算機上打我的應用程序,並關閉WIFI,我的數據庫沒有更新;但是,當我重新打開WIFI時它會更新。這令我感到擔憂,因爲我正在與期望的移動用戶構建應用程序,並且我想優雅地處理臨時連接丟失。當關閉WIFI時Firebase onDisconnect

另一方面,/.info/connected立即知道斷開連接。

任何人都可以解釋爲什麼會發生這種情況,並且如果有一種方法可以防止連接重新建立後斷開連接?

更新代碼:

 var connectedRef, userRef; 
     connectedRef = new Firebase('https://{fb}/.info/connected'); 
     userRef = new Firebase('https://{fb}/users/myUser'); 

     connectedRef.on('value', function (snap) { 

     if (snap.val()) { 
      userRef.update({ online: true }); 
      userRef.onDisconnect().update({ online: false }, function() { 
      console.log('Turn the Wi-Fi off after seeing this log.'); 
      }); 
     } 

     }); 

結果:的DB 網上設置爲false,當我打開關閉Wi-Fi,除非我等待約1分鐘。當我打開Wi-Fi時,db 確實在線設置爲false。

+2

onDisconnect事件在服務器上進行管理,而不是在客戶端進行管理。它們在連接斷開時觸發,並且客戶端(除了保持連接狀態)都不會影響到這一點。但是,您應該監視您的更新功能的成功回調 - 立即觸發並可能提供線索 – Kato

+0

@Kato好的,謝謝。我檢查了onDisconnect回調,並確實在我關閉Wi-Fi之前進行了註冊。我明白爲什麼'userRef.onDisconnect()。cancel()'不起作用,但似乎很奇怪,我的更新只發生在Wi-Fi恢復後。任何見解? – jwzirilli

+0

在onDisconnect創建之前關閉了WiFi嗎?我可以看到爲什麼onDisconnect會在重新連接時建立,因爲它位於'.info/connected'監聽器中。也許它在你離線之前沒有被調用?這裏沒有足夠的代碼和理解你的環境來實現智能化的飛躍。 – Kato

回答

5

關閉你的wifi不會以有效的方式關閉插座。因此,服務器必須等待套接字超時才能觸發onDisconnect。由於這是一個完全的服務器端過程中,唯一可能的結果是:

1)用戶不允許立即在建立onDisconnect)

2執行onDisconnect OP(在回調指示)當套接字超時或斷開連接時(事件發生時間完全達到瀏覽器/服務器協商時間(1分鐘並非不合理))時,事件將觸發。

3)Firebase建立onDisconnect事件觸發使其無效(安全規則將不允許,因爲操作不再有效)

爲了讓onDisconnect()看起來更快一點,試試使用goOffline(),我相信這會正確地關閉套接字連接。