Я создаю игру, используя firebase firestore, и мне нужно сказать, какой пользователь запустил игру. У меня была идея иметь свойство startedByPlayer: string
и использовать транзакцию для обновления этого свойства. Если это свойство уже установлено, то в конечном итоге вернуть false; в противном случае установите это свойство для текущего пользователя и в конечном итоге верните true.
Поскольку тестировать условия гонки сложно, я просто хотел убедиться, что это правильный подход:
function tryToStartGame(player : Player) {
const ref = gamesRef.doc("game");
return db.runTransaction(function (transaction) {
return transaction.get(ref).then(function (game) {
if (!game.exists) {
return false;
}
const { startedByPlayer: startedByUser } = game.data() as Game;
if (!startedByUser) {
transaction.update(ref, { startedByUser: player.id });
return true;
}
return false;
});
});
}