【问题标题】:firebase.auth().createUserWithEmailAndPassword() - completes before a using any other rxJs operatorsfirebase.auth().createUserWithEmailAndPassword() - 在使用任何其他 rxJs 运算符之前完成
【发布时间】:2020-11-04 07:32:09
【问题描述】:

我使用 angularFireAuth 进行身份验证,并将 firestore 用作数据库。

我的用例非常简单:

  1. 使用 firebase JS SDK 方法向 email 和 password 注册新用户。

  2. 注册成功后,将用户信息保存在firestore数据库中。

如果我只是使用承诺,它工作正常。然而,应用程序的其余部分,代码主要使用 observables,并且在中间使用 promise 感觉很不自然,因为大多数 API 要么消耗observable,要么返回observable。

所以我开始使用defer - Rxjs 将这些()=> promise<void> 类型转换为observable<void>

这是一个例子:

user.service.ts

  export const USER_COLLECTION = 'users';
  private userCollection: AngularFirestoreCollection;
  constructor(    private db: AngularFirestore  ) {
    this.userCollection = this.db.collection(USER_COLLECTION);  
}    

//save user in firestore db  

saveUser(user: User): Observable {    
  return defer(() =>        
   this.userCollection.doc(user.UID).set(classToPlain(user))    
  );  
}

注册方法如下:

registerUser(value: { email: string, password: string }): Observable {       
    return from(firebase.auth().createUserWithEmailAndPassword(value.email,value.password))      
              .pipe(switchMap(user => this.db.saveUser(user)))  
}

switchMap 从不调用 this.db.saveUser 。因此,用户永远不会被保存到 firestore

...在一个组件中,我订阅了registerUser method

 this.subs.sink = this.authService.registerUser(this.loginForm.value)      
.subscribe();

我不确定出了什么问题,switchMap 操作员最好取消订阅最后一个 observable(from..) 并订阅 DB.saveUser

【问题讨论】:

    标签: angular firebase google-cloud-firestore rxjs6 switchmap


    【解决方案1】:

    我尝试使用defer 而不是from 来获取Cold Observable,而不是使用then Promise 语法,我使用async - await。

    return defer(async () => {
      const cred = await firebase.auth().createUserWithEmailAndPassword(value.email, value.password);
      return cred.user;
    })
      .pipe(
        map(user => this.transformService.transformUser(user)),
        switchMap(user => this.saveUser(user))
      );
    

    工作就像一个魅力!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多