Пытаюсь получить Observable<boolean>
для моего Guard, объединив два значения Observable<boolean>
через forkJoin
.
Я пробовал этот подход раньше:
isAllowedToEditSession(sessionId: number): Observable<boolean> {
const isAllowed$: BehaviorSubject<boolean> = new BehaviorSubject(false);
const hostName = this.authService.getMyDisplayName();
this.sessionProxyService.getSessionById(sessionId).subscribe(session => {
if (session.hostName === hostName) {
isAllowed$.next(true);
}
});
this.userService.isUserAdmin().subscribe(isAdmin =>
isAllowed$.next(isAdmin));
return isAllowed$.asObservable();
}
Это сработало, но только потому, что this.userService.isUserAdmin()
является BehaviorSubject
и уже имело сохраненное значение, поэтому оно выполнялось синхронно.
Это мой текущий подход, который не дает мне того результата, на который я надеялся.
isAllowedToEditSession(sessionId: number): Observable<boolean> {
const hostName = this.authService.getMyDisplayName();
const isAllowed$ = forkJoin(
this.sessionProxyService.getSessionById(sessionId),
this.userService.isUserAdmin()
).pipe(
map(([session, isAdmin]) => {
const isHost = session.hostName === hostName;
console.log(isHost || isAdmin);
return isHost || isAdmin;
})
);
return isAllowed$;
}
isAllowed$
распознается как Observable<boolean>
, но неправильно выдает эти значения.
ОБНОВЛЕНИЕ
Это работает (см. принятый ответ для объяснения):
isAllowedToEditSession(sessionId: number): Observable<boolean> {
const hostName = this.authService.getMyDisplayName();
const isAllowed$ = forkJoin(
this.sessionProxyService.getSessionById(sessionId), //pipe(take(1)) not needed here
this.userService.isUserAdmin().pipe(take(1))
).pipe(
map(([session, isAdmin]) => {
const isHost = session.hostName === hostName;
return isHost || isAdmin;
})
);
return isAllowed$;
}
isHost
, либоisAdmin
должны возвращать true. Но принятый ответ был решением моей проблемы. - person BingeCode   schedule 23.07.2019