Что я могу вернуть в своей транзакции, если не производится запись? - PullRequest
0 голосов
/ 12 февраля 2019

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

Спасибо за любую помощь.

...