firebase transcation 第一次失败时,第二次调用哪个函数?
Which function will be called a second time when a firebase transcation fails the first time?
A function calling a transaction (transaction function) might run more
than once if a concurrent edit affects a document that the transaction
reads.
尚不清楚究竟哪个函数会在并发编辑时运行两次。在下面的示例中,outerFunc
调用了 runTranscation
方法,因此文档的字面解释意味着 outerFunc
可能会被调用两次。
然而,这似乎是一个奇怪的实现,我怀疑文档的意思是说 innerFunc
在并发编辑时可能会被调用不止一次。
import { runTransaction } from "firebase/firestore";
function outerFunc () {
console.log('outerFunction');
try {
await runTransaction(db, async function innerFunc(transaction) {
const sfDoc = await transaction.get(sfDocRef);
if (!sfDoc.exists()) {
throw "Document does not exist!";
}
const newPopulation = sfDoc.data().population + 1;
transaction.update(sfDocRef, { population: newPopulation });
});
console.log("Transaction successfully committed!");
} catch (e) {
console.log("Transaction failed: ", e);
}
}
是否可以像文档暗示的那样在进行并发编辑时调用两次 outerFunc
?
Firestore SDK 无法调用您的 outerFunc
(更不用说多次),但 Firestore SDK 确实可以多次调用您的 innerFunc
回调。
如果您觉得文档令人困惑,请在页面本身上提交反馈。右下角应该有一个link。
A function calling a transaction (transaction function) might run more than once if a concurrent edit affects a document that the transaction reads.
尚不清楚究竟哪个函数会在并发编辑时运行两次。在下面的示例中,outerFunc
调用了 runTranscation
方法,因此文档的字面解释意味着 outerFunc
可能会被调用两次。
然而,这似乎是一个奇怪的实现,我怀疑文档的意思是说 innerFunc
在并发编辑时可能会被调用不止一次。
import { runTransaction } from "firebase/firestore";
function outerFunc () {
console.log('outerFunction');
try {
await runTransaction(db, async function innerFunc(transaction) {
const sfDoc = await transaction.get(sfDocRef);
if (!sfDoc.exists()) {
throw "Document does not exist!";
}
const newPopulation = sfDoc.data().population + 1;
transaction.update(sfDocRef, { population: newPopulation });
});
console.log("Transaction successfully committed!");
} catch (e) {
console.log("Transaction failed: ", e);
}
}
是否可以像文档暗示的那样在进行并发编辑时调用两次 outerFunc
?
Firestore SDK 无法调用您的 outerFunc
(更不用说多次),但 Firestore SDK 确实可以多次调用您的 innerFunc
回调。
如果您觉得文档令人困惑,请在页面本身上提交反馈。右下角应该有一个link。