Пожарная транзакция - транзакция завершилась неудачей: TypeError: транзакция.set (...). Тогда не является функцией - PullRequest
0 голосов
/ 20 марта 2019

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

  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);
      }
    });
  }

Тем не менее, я получаю следующую ошибку:

Transaction failed:  TypeError: transaction.set(...).then is not a function

Не имеет ли transaction эквивалент then?

1 Ответ

1 голос
/ 20 марта 2019

Это не то, как написание документов работает в транзакции. Поскольку транзакция является операцией "все или ничего", вы не можете дождаться завершения set(), прежде чем переходить к другой, поэтому было бы бесполезно возвращать обещание. В случае транзакций вам необходимо set() всех ваших документов до завершения вашей функции, а затем в конце транзакция попытается записать их все. Если все они не могут быть записаны атомарно, функция транзакции будет запущена снова.

Также обратите внимание, что простой JavaScript API (не Angular) для транзакции.set () объявлен как возвращающий тот же объект транзакции, а не обещание.

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