gpt4 book ai didi

添加到列表时,Firebase transaction() 类似功能?

转载 作者:行者123 更新时间:2023-12-02 06:28:56 26 4
gpt4 key购买 nike

这是一个相当复杂的问题,但我会尽力简单明了地解释它......

我正在使用 Firebase 构建一个多用户、基于网络的游戏。我保留了游戏中每一轮的 list 。在一轮结束时,每个用户都会看到一个“开始”按钮,当他们准备好开始下一轮时,他们可以单击该按钮。当至少 50% 的用户点击“开始”时,这一轮开始。

我有一个游戏的 Firebase 引用 gameRef、一个表示回合列表的引用 roundListRef 以及一个表示回合列表的引用 roundRef本轮。

我已将 child_added 回调附加到 roundListRef,以便在添加新回合时,它会成为每个人的当前回合:

roundListRef.on('child_added', function(childSnapshot, prevChildName) {
roundRef = childSnapshot.ref();
});

我可以跟踪 newRoundVotesactivePlayers,并从那里轻松计算 50%。如果达到 50%,则会添加新一轮,这会触发每个人的 child_added 事件,新一轮将从此处开始...

gameRef.child('newRoundVotes').on('value', function(snapshot) {
var newRoundVotes = snapshot.val();

gameRef.child('activePlayers').once('value', function(snapshot) {
var activePlayers = snapshot.val();

if (newDriveVotes / activePlayers >= 0.5)
addNewRound();
});
});

我的问题是,如何确保只添加一轮新一轮,并且每个人都在同一轮?

例如,假设有 10 名玩家,其中 4 人已投票开始下一轮。如果第 6 名玩家在第 5 名玩家触发其 child_added 事件之前投票,那么也会为第 6 名玩家添加一轮。

这个问题类似于 .set().transaction(),但不完全相同(根据我的理解)。

有人有解决办法吗?

最佳答案

我认为,如果提前知道回合名称,您可能可以通过交易来解决这个问题。例如。如果您只使用/round/0、/round/1、/round/2 等。

然后你可以有一些代码,例如:

function addNewRound() {
var currentRound = Number(roundRef.name());
var nextRound = currentRound + 1;

// Use a transaction to try to create the next round.
roundRefList.child(nextRound).transaction(function(newRoundValue) {
if (newRoundValue == null) {
// create new round.
return { /* whatever should be stored for the round. */ };
} else {
// somebody else already created it. Do nothing.
}
});
}

这适用于您的场景吗?

关于添加到列表时,Firebase transaction() 类似功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11786428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com