我有一个回合制游戏,我想验证和处理每个玩家发送的数据,然后使用 firebase 触发器更新状态。目前使用RTDB。澄清一下,该节点如下所示:
所以,我目前在 gameId/state 上有一个触发器。如果 userTurn 不为 null,则将 userTurn 与当前的 stateVariables 一起传递给创建新游戏状态的函数,然后更新状态变量,删除 userTurn。
当触发器删除 userTurn(并更新 stateVariables)时,触发器将再次触发。但由于 userTurn 为 null,我将返回 null,然后我们等待下一个玩家的回合。
我为什么要这样做?因为速度很重要,所以我想尽可能快地处理数据。有计时器,为了用户体验,转弯必须尽可能快。
问题很明显:每一次移动,触发器都会有2次调用和2次读取,这会增加我的成本。
我考虑过简单地将触发器放在 gameId/state/userTurn 上并读取 gameId/state/stateVariables -> 再次更新状态。但这会增加回合之间的时间并增加所有玩家的感知延迟。我当前解决方案的优点是触发器在触发时可以立即访问 stateVariables 中的数据。
所以我的问题是:有没有办法避免双重调用?或者更好的方法?
感谢任何帮助和想法!
在不改变数据模型的情况下,没有办法阻止这种双重调用。您必须在第二次检测并中止该函数。
如果您愿意更改数据模型,常见的解决方案是拥有两个单独的队列(此处可能基于
userTurn
值)并将任务从一个队列移动到另一个队列。