我正在使用AngularFire來管理我的應用程式中的用戶。我仍在學習 observables 和 rxjs。
我正在嘗試呼叫signInWithEmailAndPassword方法 - 回傳一個承諾 - 并從集合中檢索檔案。
在我的服務中,我使用此方法獲取檔案:
getDbUser(uid): Observable<User> {
return this.angularFirestore.collection<User>(USERS).doc(uid).valueChanges()
}
我登錄用戶:
login(user: User) {
// sign in con email e password
return this.angularFireAuth.signInWithEmailAndPassword(user.email, user.password)
.then((result) => {
if(result.user?.uid) {
// get user doc
return this.getDbUser(result.user.uid);
}
return null;
});
}
使用這段代碼,呼叫登錄方法需要解決一個promise,然后訂閱observable,如下所示:
this.userService.login(this.loginUser)
.then((userObs) => {
userObs.subscribe((user) => {
console.log(user);
});
})
我真的很想避免這種情況,但我不知道該怎么做。我嘗試使用 RxJstoPromise運算子:
login(user: User) {
// sign in con email e password
return this.angularFireAuth.signInWithEmailAndPassword(user.email, user.password)
.then((result) => {
if(result.user?.uid) {
// recupero l'utente dal db
return this.getDbUser(result.user.uid).toPromise();
}
return null;
});
}
但不知何故這不起作用(承諾從未解決)。
uj5u.com熱心網友回復:
第一條評論是正確答案:
您可以
.pipe(first())在.toPromise“之前添加”
uj5u.com熱心網友回復:
如果您想讓任何可觀察的消費者知道用戶僅在 signInWithEmailAndPassword() 回傳后才登錄,我將 decalre 一個主題并從任何服務消費者訂閱 user$。
private userSubject$:Subject<string>=new Subject<string>();
public user$:Observable<string>=this.userSubject$.asObservable();
login(user: User) {
// sign in con email e password
return this.angularFireAuth.signInWithEmailAndPassword(user.email, user.password)
.then((result) => {
if(result.user?.uid) {
// recupero l'utente dal db
return this.userSubject$.next(result.user.uid);
}
return null;
});
從外面你將使用該服務:
this.userService.login(this.loginUser);
this.userService.user$.subscribe(user=>console.log);
uj5u.com熱心網友回復:
嘗試使用 rxjs 運算子,例如 mergeMap 、 swtichMap 、 pipe 、 map 等。您可以避免使用這些運算子進行嵌套訂閱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/402126.html
標籤:javascript 有角的 承诺 rxjs 可观察的
