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

#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. Работает как шарм. Спасибо за это, я всегда использовал только подписку.