我正在尝试编写一个解析器,如果用户通过firebase登录,它将从数据库中获取其他数据。我有一个获取数据的服务,但是当我尝试首先获取Firebase uid时,我无法正确确定解析器的时间:
如果我对uid进行硬编码,则可以正常工作:
@Injectable()
export class AuthResolver implements Resolve<User> {
constructor(
private firebaseAuth: AngularFireAuth,
private userService: UsersService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
return this.userService.getUser("[firebase uid]"); // returns an Observable<User>
}
}
但是,当我尝试首先获取firebase uid时,解析程序会在初始可观察对象完成之前完成。
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
this.firebaseAuth.user.subscribe(response => {
console.log(response.uid);
this.userService.getUser(response.uid).subscribe(user => {
console.log(user);
return user;
})
});
console.log("returning...");
return;
}
在控制台中:
> returning...
(Page I am trying to resolve loads here because the resolver is finished)
> [response.uid]
> [User object from the reoslver]
在解析器完成之前,我不知道如何完成可观察的操作。
编辑:这是我尝试使用mergeMap:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
return this.firebaseAuth.user.pipe(
mergeMap(firebaseUser => this.userService.getUser(firebaseUser.uid))
);
}
这没有用。它确实返回了一个可观察到的,但没有返回Observable<User>
。
答案 0 :(得分:1)
您可能要使用flatMap来解开对getUser()
的调用返回的值:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
return this.firebaseAuth.user.pipe(
flatMap({uid} => this.userService.getUser(uid))
);
}
这里发生的是,每当我们从FireBase user
观察到响应时,我们都会提取其uid
,获取用户数据,并将其作为从{{1}返回的结果可观察到的值提供}方法。
答案 1 :(得分:0)
只有获得所需结果后,您才能退还诺言并解决:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any{
const promise=new Promise((resolve,reject))=>{
this.firebaseAuth.user.pipe(
catchError((err, caught) => reject(err);) // here reject if request failed
).subscribe(response => {
console.log(response.uid);
this.userService.getUser(response.uid).subscribe(user => {
console.log(user);
resolve(user); // Or Resolve wherever required
return user;
})
});
console.log("returning...");
return;
});
return promise;
}