2017-10-12 74 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

您当前的方法根本无法工作:用户断开连接后,他们无法再进行更改。这就是为什么在连接时必须知道每个用户的更改,文档中的状态系统可以确保这些更改。 –