RxJS новичок здесь. Использование Angular 6. Попытка выяснить, как получить Observable<T>
из Observable<Observable<T>>
. Не уверен, что это даже верно и изо всех сил пытается понять это концептуально, однако это кажется простой проблемой.
Я изучал switchMap, flatMap, forJoin, однако не думаю, что они соответствуют моим потребностям.
То, что я пытаюсь сделать, это защита углового маршрута, которая будет препятствовать доступу пользователей к маршруту, если у них нет необходимых разрешений. 2 зависимости - это профиль пользователя, от которого они получают информацию, который затем используется для получения их разрешений. Эта смесь приводит к проблеме Наблюдаемой Наблюдаемой. Вот что у меня есть:
export class AuthPermissionsRouteGuard implements CanActivate {
constructor(
private router: Router,
private authService: AuthPermissionsService,
private openIdService: AuthOpenIdService) {}
/**Navigates to route if user has necessary permission, navigates to '/forbidden' otherwise */
canActivate(routeSnapshot: ActivatedRouteSnapshot): Observable<boolean> {
return this.canNavigateToRoute(routeSnapshot.data['permissionId'] as number);
}
/**Waits on a valid user profile, once we get one - checks permissions */
private canNavigateToRoute(permissionId: number): Observable<boolean> {
const observableOfObservable = this.openIdService.$userProfile
.pipe(
filter(userProfile => userProfile ? true : false),
map(_ => this.hasPermissionObservable(permissionId)));
// Type Observable<Observable<T>> is not assignable to Observable<T> :(
return observableOfObservable;
}
/**Checks if user has permission to access desired route and returns the result. Navigates to '/forbidden' if no permissions */
private hasPermissionObservable(permissionId: number): Observable<boolean> {
return this.permissionsService.hasPermission(permissionId).pipe(
map(hasPermission => {
if (!hasPermission) {
this.router.navigate(['/forbidden']);
}
return hasPermission;
}
));
}
}
Большое спасибо !!