Маршрут Angular2 разрешает несколько действий

Привет,

У меня есть приложение, в котором у нас есть несколько пользователей, и я хочу видеть сведения о пользователе, поэтому мне нужно разрешить этого пользователя по идентификатору перед вводом маршрута. Все хорошо, когда я это делаю, если я сначала попадаю в компонент пользователей, который извлекает всех пользователей. Но в случае перезагрузки маршрут пытается разрешить пользователя по идентификатору и терпит неудачу, потому что пользователей уже нет (они еще не были получены). Я хотел бы проверить, существуют ли пользователи, получить их, а затем разрешить маршрут с пользователем. Вот код:

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'];
  }
); 

Все, что я получаю, когда слушаю данные маршрута, это объект с пользователем: подписчик. Когда я возвращаю только функцию this.usersService.getUserById, пользовательский объект приходит нормально.


person Prototype    schedule 20.10.2016    source источник


Ответы (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); 
 }
} 
person Harry Ninh    schedule 20.10.2016
comment
Работает как шарм. Спасибо за это, я всегда использовал только подписку. - person Prototype; 20.10.2016