Я пытаюсь написать распознаватель, который будет извлекать дополнительные данные из моей базы данных, если пользователь вошел в систему через firebase. У меня есть служба, которая получает данные, но когда я сначала пытаюсь получить идентификатор firebase, я не могу правильно определить время распознавателя:
Если я жестко запрограммировал 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>
}
}
Но когда я сначала пытаюсь получить идентификатор базы данных, распознаватель завершает работу до того, как завершится начальная наблюдаемая.
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]
Я не знаю, как завершить наблюдаемое до завершения распознавателя.
edit: это моя попытка использовать mergeMap:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
return this.firebaseAuth.user.pipe(
mergeMap(firebaseUser => this.userService.getUser(firebaseUser.uid))
);
}
Это не сработало. Это вернуло наблюдаемое, но не Observable<User>
.