英文:
Firebase not updating values as fast as I want with Javascript
问题
[![在此输入图像描述][1]][1]
[1]: https://i.stack.imgur.com/j5L3g.png
所以我有这个网站,它像一个统计表,当我按下-1按钮时,游戏的得分减少1分。我使用JavaScript访问Firebase数据库,然后将得分减1。
const docRef = doc(db, "Games", game_id);
const docSnap = await getDoc(docRef);
var score = docSnap.data().team2_score
await updateDoc(docRef, {
team2_score: score -= number
});
问题是,如果用户快速多次点击它,那么Firebase不会执行所有这些操作。所以如果用户快速点击按钮5次,Firebase数据库只会跟踪其中4次。这是我的问题。
是否有一种方法可以确保数据库中的每次点击都会更新,即使点击得很快?
英文:
So I have this website, that acts like a stat sheet and when I press the -1 button, the score of the game goes down by 1. I'm using javascript to access the firebase database and then subtract the score by 1.
const docRef = doc(db, "Games", game_id);
const docSnap = await getDoc(docRef);
var score = docSnap.data().team2_score
await updateDoc(docRef, {
team2_score: score -= number
});
The issue is that if a user clicks it really fast multiple times, then Firebase doesn't do all those operations. So if a user clicks the button 5 times really fast, the Firebase database would only keep track of 4 of them. This is my issue.
Is there a way to make sure that every single one of those clicks updated in the database, even when clicked really fast?
答案1
得分: 2
Option 1
使用 Firebase Increment:https://cloud.google.com/firestore/docs/samples/firestore-data-set-numeric-increment
const docRef = doc(db, "Games", game_id);
await updateDoc(docRef, {
team2_score: firebase.firestore.FieldValue.increment(-1)
});
Option 2
使用事务。https://firebase.google.com/docs/firestore/manage-data/transactions#transactions
const docRef = doc(db, "Games", game_id);
try {
const result = await db.runTransaction((transaction) => {
// 如果存在冲突,此代码可能会被多次运行。
return transaction.get(docRef).then((sfDoc) => {
if (!sfDoc.exists) {
throw "文档不存在!";
}
// 注意:可以使用 FieldValue.increment() 更新分数,而不需要事务
var newScore = sfDoc.data().team2_score - 1;
transaction.update(docRef, { team2_score: newScore });
});
})
console.log("事务成功提交!");
} catch (error) {
console.log("事务失败:", error);
}
英文:
You have two options:
Option 1
Use Firebase Increment: https://cloud.google.com/firestore/docs/samples/firestore-data-set-numeric-increment
const docRef = doc(db, "Games", game_id);
await updateDoc(docRef, {
team2_score: firebase.firestore.FieldValue.increment(-1)
});
Option 2
Use a Transaction. https://firebase.google.com/docs/firestore/manage-data/transactions#transactions
const docRef = doc(db, "Games", game_id);
try {
const result = await db.runTransaction((transaction) => {
// This code may get re-run multiple times if there are conflicts.
return transaction.get(docRef).then((sfDoc) => {
if (!sfDoc.exists) {
throw "Document does not exist!";
}
// Note: this could be done without a transaction
// by updating the score using FieldValue.increment()
var newScore= sfDoc.data().team2_score - 1;
transaction.update(docRef, { team2_score: newScore});
});
})
console.log("Transaction successfully committed!");
} catch(error) {
console.log("Transaction failed: ", error);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论