Завершить наблюдаемое - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь написать распознаватель, который будет извлекать дополнительные данные из моей базы данных, если пользователь вошел в систему через 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>.

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Возможно, вы захотите использовать flatMap , чтобы развернуть значение, возвращаемое при вызове, в getUser():

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<User> {
    return this.firebaseAuth.user.pipe(
        flatMap({uid} => this.userService.getUser(uid))
    );

}

.мы получаем ответ от FireBase user observable, мы извлекаем его uid, выбираем пользовательские данные и предоставляем их в качестве значения для результирующей наблюдаемой, возвращаемой методом resolve.

0 голосов
/ 15 июня 2019

Вы можете вернуть обещание и решить только тогда, когда вы получите желаемый результат:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...