2017-10-12 113 views
1

我在firebase上有一個節點,列出遊戲中的所有玩家。此列表將在新玩家加入時更新。噹噹前用戶(我)斷開連接時,我想從列表中刪除我自己。斷開連接時的Firebase更新

由於名單將隨時間而改變,在我斷開的那一刻,我想更新列表,然後更新火力點。

這是我想這樣做的方式,但它不工作作爲.update犯規接受功能。只有對象。但是,如果我事先創建對象,當.onDisconnect調用時,它不會是最新的對象......我該如何去做這件事?

payload.onDisconnect().update(() => { 
      const withoutMe = state.roomObj 
      const index = withoutMe.players.indexOf(state.userObj.name) 
      if (index > -1) { 
       withoutMe.players.splice(index, 1) 
      } 
      return withoutMe 
     }) 

回答

2

onDisconnect處理程序是針對此用例製作的。但它要求在設置onDisconnect時寫入操作的數據是已知的。如果你仔細想想,這應該是有意義:由於onDisconnect發生後,您的客戶端斷開,即寫操作的數據的數據必須斷開之前被稱爲

這聽起來像你建立一個所謂的在線系統:包含針對目前網上每個用戶節點的列表。該Firebase documentation has an example of such a presence system。與你的方法的主要區別在於它在文檔中每個用戶只修改他們自己的節點。

所以:當用戶上線時,他們寫一個節點自己。然後,當他們斷開連接時,該節點被刪除。由於所有用戶都將他們的節點寫入同一父節點,因此該父節點將反映在線用戶。

實際的實現是有點更復雜,因爲它有一些優勢情況下交易了。因此,我建議您查看我鏈接的文檔中的代碼,並將其用作您自己的類似系統的基礎。

+0

感謝您的回覆!嗯...因爲我試圖創建一個用戶可以加入的遊戲室。其他用戶可以看到房間裏有誰。我想這跟聊天室很相似。你鏈接的存在系統,我不太清楚如何使用它,除非有一箇中央服務器程序通過推送和刪除不同的房間來存在並執行某些操作。 –

+0

你所描述的實際上是一個在線系統。與文檔中唯一的不同之處在於,對於您的情況,您希望它是每個遊戲室,這應該是一個相當小的修改。我建議你嘗試一下文檔中的一個,一旦它有效,就對它進行修改。 –

+0

您當前的方法根本無法工作:用戶斷開連接後,他們無法再進行更改。這就是爲什麼在連接時必須知道每個用戶的更改,文檔中的狀態系統可以確保這些更改。 –