我正在尝试在Firebase / Angular 6应用程序中运行事务,但该事务无法正常工作。
这是我拥有的:
try {
const transactionResult = await db.runTransaction(async trans => {
let groupRecords: any[] = [];
for (var i = 0; i < groupIDs.length; i++) {
const groupDocRef = db.collection('Groups').doc(groupIDs[i]);
const groupDoc = await trans.get(groupDocRef);
groupRecords.push(groupDoc);
}
for (var i = 0; i < groupRecords.length; i++) {
const groupData = groupRecords[i].data();
await trans.set(groupRecords[i].ref, groupData, {merge: true});
};
return trans.commit();
} catch (err) {
console.log('Error updating groups:', err);
return Promise.reject('Error updating groups: ' + err);
}
return trans.commit();
我遇到的问题是,该事务不断重复(基于上面代码片段中省略的控制台日志),然后引发错误:引用的事务已过期或不再有效。
通常,当我进行交易时,我返回trans.set(...)的结果,并且可以正常工作。这次我不能那样做。这次,我要更新一组组。我首先进行所有获取(在第一个for循环中),然后进行所有设置(在第二个for循环中)。我不返回这些集合,因为我希望所有的for循环都能完成。完成设置后,我唯一想到的就是进行提交。因此:return trans.commit()
。 <—但这似乎导致重复运行事务最终导致错误。
当一个交易发生时,如何在交易中返回适当的对象,以使交易有效(即不重复,不抛出过期/无效错误,如果出现问题则可以回滚等)。做多套?