Как разбить мою транзакцию firestore на небольшие функции для повторного использования? - PullRequest
0 голосов
/ 31 мая 2019

В моем проекте я выполняю много транзакций в разных местах, иногда обращаюсь к одной и той же коллекции и выполняю одно и то же действие. Я пытаюсь лучше объяснить:

  • по моему 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.

Итак, я не знаю, как это сделать, и если это возможно.

Пожалуйста, помогите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...