Я работаю с транзакцией базы данных в моем проекте 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 (…)),будет счастлив.Но как я могу вернуть объект транзакции, когда я не делаю никаких записей?Могу ли я создать пустую транзакцию или транзакцию по умолчанию?Есть ли какой-нибудь другой объект, который я могу вернуть?
Спасибо за любую помощь.