首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firestore - transaction失败: TypeError: transaction.set(...).then不是函数

Firestore - transaction失败: TypeError: transaction.set(...).then不是函数
EN

Stack Overflow用户
提问于 2019-03-20 23:17:05
回答 1查看 227关注 0票数 0

在尝试创建用户之前,我已经编写了一个事务来检查Firestore中是否存在该用户。

代码语言:javascript
复制
  setUserData(uid, email, displayName, photoURL, firstName, lastName, referralId) {
    const userRef = this.afs.firestore.collection('users').doc(`${uid}`);
    return this.afs.firestore.runTransaction(async (transaction: any) => {
      const doc = await transaction.get(userRef);
      let userData = {};
      if (!doc.exists) {
        userData = {
          uid: uid,
          email: email,
          displayName: displayName,
          photoURL: photoURL,
          emailVerified: true,
          firstName: firstName,
          lastName: lastName,
          referralId: referralId
        };
        transaction.set(userRef, { userData }, { merge: true }).then(() => {
          this.referralService.addUserToWaitlist(referralId);
        });
      }
    }).then(() => {
      if (!environment.production) {
        console.log(
          'Transaction successfully committed.'
        );
      }
    }).catch((error) => {
      if (!environment.production) {
        console.log('Transaction failed: ', error);
      }
    });
  }

但是,我一直收到以下错误:

代码语言:javascript
复制
Transaction failed:  TypeError: transaction.set(...).then is not a function

transaction没有then的等价物吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 23:38:34

这不是在事务中编写文档的方式。由于事务是要么全有要么全无的操作,您不能等待一个set()完成后再继续执行另一个事务,因此它返回一个promise是没有帮助的。对于事务,您必须在函数结束之前对所有文档执行set()操作,然后在函数结束时,事务将尝试将它们全部写入。如果它们不能全部以原子方式编写,您的事务函数将再次运行。

还要注意,用于transaction.set()的普通JavaScript API (不是Angular)被声明为返回相同的事务对象,而不是promise。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55264263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档