我是Firebase的新手,正在阅读文档以进行学习。
我目前使用的是Firestore而不是数据库,老实说,我不确定每个存储区的优缺点。
在他们针对reading and writing data到数据库的教程中,他们具有以下有关transactions的代码:
function toggleStar(postRef, uid) {
postRef.transaction(function(post) {
if (post) {
if (post.stars && post.stars[uid]) {
post.starCount--;
post.stars[uid] = null;
} else {
post.starCount++;
if (!post.stars) {
post.stars = {};
}
post.stars[uid] = true;
}
}
return post;
});
}
在这种情况下,这是为了减轻对变量stars
的争用条件/损坏。
我的问题是transaction
的Firestore等价物是什么
import firebase from 'firebase'
const postId = 1
const firestorePostRef = firebase.firestore().collection('posts').doc(postId)
// throws an error that firestorePostRef.transaction is not defined
firestorePostRef.transaction( (post) => {
if (post) {
// ...
}
})
答案 0 :(得分:1)
Firebase Firestore具有相同的功能。读取数据并以相同的操作覆盖类似:
// Create a reference to the SF doc.
var sfDocRef = db.collection("cities").doc("SF");
db.runTransaction(function(transaction) {
return transaction.get(sfDocRef).then(function(sfDoc) {
if (!sfDoc.exists) {
throw "Document does not exist!";
}
var newPopulation = sfDoc.data().population + 1;
if (newPopulation <= 1000000) {
transaction.update(sfDocRef, { population: newPopulation });
return newPopulation;
} else {
return Promise.reject("Sorry! Population is too big.");
}
});
}).then(function(newPopulation) {
console.log("Population increased to ", newPopulation);
}).catch(function(err) {
// This will be an "population is too big" error.
console.error(err);
});
这里是相关文件link