【发布时间】:2020-11-04 07:32:09
【问题描述】:
我使用 angularFireAuth 进行身份验证,并将 firestore 用作数据库。
我的用例非常简单:
-
使用 firebase JS SDK 方法向
email和password注册新用户。 -
注册成功后,将用户信息保存在
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