#angular #rxjs #angular2-routing #angular2-observables
#angular #rxjs #angular2-маршрутизация #angular2-наблюдаемые
Вопрос:
Hei,
У меня есть приложение, в котором у нас несколько пользователей, и я хочу видеть сведения о пользователе, поэтому мне нужно разрешить этого пользователя по идентификатору перед вводом маршрута. Все хорошо, когда я делаю это, если я сначала подключаюсь к компоненту users, который выбирает всех пользователей. Но в случае перезагрузки маршрут пытается разрешить пользователя по идентификатору и завершается неудачей, потому что пользователей уже нет (они еще не были извлечены). Я хотел бы проверить, существуют ли пользователи, получить их, а затем разрешить маршрут с помощью user. Вот код:
resolve(route: ActivatedRouteSnapshot): Observable<any>|Promise<any>|any {
let id = route.params['id'];
if (!this.usersService.checkIfUsersExist()) {
return this.usersService.getUsers().subscribe(
(success) => {
return this.usersService.getUserById(id);
},
(error) => {
this.router.navigate([ 'login ']);
}
);
} else {
return this.usersService.getUserById(id);
}
}
А затем в компоненте
this.route.data.subscribe(
(res) => {
this.user= res['user'];
}
);
Все, что я получаю при прослушивании данных маршрута, — это объект с пользователем: подписчик. Когда я возвращаю только эту функцию.usersService.getUserById, пользовательский объект приходит нормально.
Ответ №1:
Измените его на использование switchMap
:
resolve(route: ActivatedRouteSnapshot): Observable<any>|Promise<any>|any {
let id = route.params['id'];
if (!this.usersService.checkIfUsersExist()) {
return this.usersService.getUsers()
.switchMap(
(success) => {
return this.usersService.getUserById(id);
})
.catch((err) => this.router.navigate([ 'login ']));
} else {
return this.usersService.getUserById(id);
}
}
Комментарии:
1. Работает как шарм. Спасибо за это, я всегда использовал только подписку.