我在 firebase 上有一个节点,其中列出了游戏中的所有玩家。此列表将在新玩家加入时更新。当当前用户 ( me ) 断开连接时,我想将自己从列表中删除。
由于列表会随时间变化,在我断开连接的那一刻,我想更新这个列表并更新 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
})
最佳答案
onDisconnect
处理程序是为这个用例制作的。但它要求写入操作的数据在您设置 onDisconnect
时是已知的。如果您考虑一下,这应该是有道理的:因为 onDisconnect
发生在您的客户端断开连接之后,所以该写入操作的数据必须是已知的在断开连接之前。
听起来您正在构建一个所谓的状态系统:一个列表,其中包含当前在线的每个用户的节点。 Firebase documentation has an example of such a presence system .与您的方法的主要区别在于它在文档中每个用户只修改他们自己的节点。
因此:当用户上线时,他们为自己编写一个节点。然后当他们断开连接时,该节点将被删除。由于所有用户都将他们的节点写在同一个父节点下,因此该父节点将反射(reflect)在线用户。
实际的实现要复杂一些,因为它也处理一些边缘情况。因此,我建议您查看我链接的文档中的代码,并将其用作您自己的类似系统的基础。
关于断开连接时的 Firebase 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46710850/