我正在我的angular / firebase项目中处理数据库事务。看起来像这样:
const transactionResult = await db.runTransaction(async trans => {
// Get references:
const parentGroupRef = db.collection('Groups').doc(parentGroupID);
const childGroupRef = db.collection('Groups').doc(childGroupID);
// Get documents:
const promiseArray: Promise<any>[] = [];
promiseArray.push(trans.get(parentGroupRef));
promiseArray.push(trans.get(childGroupRef));
const promiseResults: any[] = await Promise.all(promiseArray);
// Get the group documents of the promise results:
const parentGroupDoc = promiseResults.filter(groupDoc => { return groupDoc.id === parentGroupID; })[0];
const childGroupDoc = promiseResults.filter(groupDoc => { return groupDoc.id === childGroupID; })[0];
// Get data:
if (parentGroupDoc && parentGroupDoc.exists && childGroupDoc && childGroupDoc.exists) {
const parentGroupData = parentGroupDoc.data();
const childGroupData = childGroupDoc.data();
// Add child to parent and visa-versa:
const results: any[] = [];
if (parentGroupData.childGroupIDs.indexOf(childGroupID) === -1) {
parentGroupData.childGroupIDs.push(childGroupID);
const addChildResult = trans.set(parentGroupRef, parentGroupData, {merge: true});
results.push(addChildResult);
}
if (childGroupData.parentGroupIDs.indexOf(parentGroupID) === -1) {
childGroupData.parentGroupIDs.push(parentGroupID);
const addParentResult = trans.set(childGroupRef, childGroupData, {merge: true});
results.push(addParentResult);
}
if (results.length > 0) {
return await Promise.all(results);
} else {
return Promise.reject('No changes made’); // <—- This line here
}
} else {
console.log('Could not find parent or child group, or both.');
return Promise.reject('Could not find parent or child group, or both.’);
}
});
它实际上从数据库中获取了两个组-父组和子组-然后尝试将子组添加到父组,反之亦然。
但是,在这样做之前,它会检查父组是否已经是子组的一部分。如果是这样,它将跳过将父组添加到子组的操作。同样,将子组添加到父组。
如果父组和子组已经是彼此的一部分,则不会添加任何一个。这是我要处理的条件。我目前正在通过返回被拒绝的承诺(我在此处评论“此行”的部分)进行处理。但是在这种情况下,我不希望它出错。如果两个小组已经是彼此的一部分,我希望它只是安静地返回。因此,我希望返回已解决的承诺。但这行不通。如果我返回了已解决的承诺,则该交易将引发以下错误:
TypeError: Cannot read property 'seconds' of null
我猜测如果我将其解析为交易对象(例如trans.set(…)返回的内容),那将会很高兴。但是,当我不执行任何写操作时,如何返回事务对象?我可以创建一个空或默认交易吗?我还能返回其他物品吗?
感谢您的帮助。