不进行写操作时,我可以在交易中返回什么?

时间:2019-02-12 20:25:19

标签: angular firebase promise transactions

我正在我的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(…)返回的内容),那将会很高兴。但是,当我不执行任何写操作时,如何返回事务对象?我可以创建一个空或默认交易吗?我还能返回其他物品吗?

感谢您的帮助。

0 个答案:

没有答案