完成一个可观察的

时间:2019-06-15 02:27:57

标签: angular firebase observable

我正在尝试编写一个解析器,如果用户通过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>

2 个答案:

答案 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;
}