首页 > 解决方案 > transaction.set(...) 是同步的吗?

问题描述

我正在我的 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');
                }
            } else {
                console.log('Could not find parent or child group, or both.');
                return Promise.reject('Could not find parent or child group, or both.');
            }
        });

如您所见,我正在等待从 trans.get(...) 返回的承诺。对 trans.set(...) 做同样的事情有意义吗?对 trans.get(...) 这样做是有意义的,因为 trans.get(...) 返回一个承诺。但是 trans.set(...) 返回一个事务对象。所以我的问题是:trans.set(...) 是同步的吗?

标签: angularfirebasepromisetransactionsasync-await

解决方案


所有与远程服务交互的 Firebase API 都是异步的,包括用于事务的 API。

阅读:为什么 Firebase API 是异步的?


推荐阅读