【问题标题】:Function in async function chain not being called未调用异步函数链中的函数
【发布时间】:2021-01-03 18:36:18
【问题描述】:

我想在用户登录时更新 Firestore 中的数据,并使用以下代码执行此操作。出于某种原因,代码不起作用(请参阅 cmets)并且不会从 firebase.User 创建自定义 User 对象。为什么会发生这种情况/我该如何解决?我没有收到任何错误。

登录时调用的代码

async emailLogIn(email: string, password: string) {
  return this.auth.signInWithEmailAndPassword(email, password)
    .then( async (credential) => {
      this.analytics.logEvent('logged_in', { method: 'email' });

      const firebaseUser = credential.user;
      if(firebaseUser) {
        const user = await this.createUserFromFirebaseUser(firebaseUser);
        console.log(user); // This doesn't print anything
        this.updateUserData(user);
        if(!firebaseUser.emailVerified) {
          this.sendEmailVerification();
        }
      }
    });
}

firebase.User 转换为User 的代码(不起作用)

async createUserFromFirebaseUser(firebaseUser: firebase.User): Promise<User> {
  console.log('createUserFromFirebaseUser()');
  const currentUser = await this.user.toPromise();
  console.log(currentUser); // This doesn't print anything

  if(currentUser)
    return currentUser;

  const user: User = {
    uid: firebaseUser.uid,
    email: firebaseUser.email,
    displayName: firebaseUser.displayName,
    settings: {
      language: 'English',
      isPrivate: false,
      newFountainNotification: true,
      userFountainNotification: true,
      feedbackNotification: true,
      units: 'Metric'
    }
  }
  
  return user;
} 

从 Firestore 获取用户数据

this.user = this.auth.authState.pipe(
  takeUntil(this.destroy),
  switchMap( (user) => {
    if(user) {
      return (this.firestore.collection('users').doc(user.uid).valueChanges() as Observable<User>)
    } else {
      return of(null);
    }
  })
);

【问题讨论】:

  • 问题可能出在您创建新用户对象的那一行。您将类型定义为User。用户界面是否支持您添加的所有属性?尝试输入any 看看是否可行。
  • @AbrarHossain 是的,user 变量具有User 的所有属性。我认为这不是问题,因为它之前的行没有执行 (console.log(currentUser);)
  • 所以是打印undefined?您的代码中的 this.user 是什么?

标签: javascript angular firebase


【解决方案1】:

使用this.user.toPromise()似乎是个问题

这是有效的代码:

return this.user.pipe(
    take(1),
    map( (currentUser) => {
      if(currentUser)
        return currentUser;

      const user: User = {
        uid: firebaseUser.uid,
        email: firebaseUser.email,
        displayName: firebaseUser.displayName,
        settings: {
          language: 'English',
          isPrivate: false,
          newFountainNotification: true,
          userFountainNotification: true,
          feedbackNotification: true,
          units: 'Metric'
        }
      }
      
      return user;
    })
  ).toPromise()

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 2019-01-20
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2015-01-22
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多