В моем проекте я выполняю много транзакций в разных местах, иногда обращаюсь к одной и той же коллекции и выполняю одно и то же действие. Я пытаюсь лучше объяснить:
- по моему
transactionA
, влияет на collectionOne
и collectionTwo
- по моему
transactionB
, влияет на collectionOne
и collectionThree
Так что я хочу создать небольшие функции для повторного использования в моих транзакциях в магазине.
Сегодня я делаю то же самое, что и пример ниже, но я не знаю, правильно ли это, и если это лучший способ сделать это.
- В этом примере я хочу использовать повторно:
transactionalAddIssue
export function addDepartment(pathToNotice, department, issue) {
return new Promise((resolve, reject) => {
const noticeRef = firestore.doc(pathToNotice);
const treeRef = firestore.doc(`${pathToNotice}/tree/chart`);
return firestore
.runTransaction(async transaction => {
const treeDoc = await transaction.get(treeRef);
const tree = treeDoc.data();
const noticeDoc = await transaction.get(noticeRef);
const noticeCoworkers = [...noticeDoc.data().coworkers];
const newChildren = {
id: department.id,
menu: true,
name: "Colaborador",
title: department.name
};
tree.children[0].children[0].children ?
tree.children[0].children[0].children.push(newChildren) :
tree.children[0].children[0].children = [newChildren]
noticeCoworkers.push(department.id);
await transactionalAddIssue(transaction, issue);
transaction.update(noticeRef, {coworkers: [...noticeCoworkers]});
transaction.set(treeRef, tree);
})
.then(() => resolve())
.catch(error => {
reject(error)
});
})
}
function transactionalAddIssue(transaction, issue) {
return new Promise(async resolve => {
const {createdTo} = issue;
const issueRef = firestore.collection(`departments/${createdTo.id}/issues`).doc();
const issueTransformed = await transformIssue(transaction, issue);
transaction.set(issueRef, issueTransformed);
resolve();
})
}
Сегодня этот способ работает, но если я добавлю больше функций для такого вызова в моей транзакции, я считаю, что она вылетит
Если я звоню без await
, происходит сбой, потому что чтение, вероятно, запускается после transaction.update
или transaction.set
.
Возможно, если я вызову funcs с await
и отправлю transaction.update
или transaction.set
внутри транзакции, и использую небольшую функцию только для чтения, манипулирования данными и возврата мне только того, что мне нужно для обновления firestore.
Итак, я не знаю, как это сделать, и если это возможно.
Пожалуйста, помогите мне.