rxjs switchMap не работает в Angular Guard?

return this.auth.user.pipe(
      switchMap((user: IUser) => {
        return of(true);
      })
    );

Мой исходный код был немного сложнее, в некоторых случаях в зависимости от пользовательских данных, но для целей тестирования я использовал приведенный выше код в canLoad охранника, и он не активируется.

Есть какие-либо ошибки TS / компиляции.

Я пробовал как с Айви, так и без.

Я использую Angular 8.3;


person SebastianG    schedule 13.09.2019    source источник
comment
напишите пожалуйста ошибку   -  person Khashayar Pakkhesal    schedule 13.09.2019
comment
@KhashayarPakkhesal ошибки нет, маршрут не активируется. Я добавил оператор catchError на всякий случай, и ошибки тоже нет. Я проверил, работает ли этот код внутри switchMap, и он работает. Если я что-то зарегистрирую на консоли, это появится, когда я попытаюсь активировать маршрут.   -  person SebastianG    schedule 13.09.2019


Ответы (1)


Вы должны использовать take(1), потому что я уверен, что auth.user является потоком и не завершается. У охранника должен быть завершающий Observable:

return this.auth.user.pipe(
  take(1),
  switchMap((user: IUser) => of(!!user))
);

Возможно, вы удалили какой-то код, но вы также можете просто использовать карту здесь:

return this.auth.user.pipe(
  take(1),
  map((user: IUser) => !!user)
);
person Poul Kruijt    schedule 13.09.2019
comment
Никогда не завершается или, возможно, никогда не излучает. Оба остановят его загрузку. - person Reactgular; 13.09.2019
comment
Это работает - я не знал, что охраннику нужен завершающий наблюдаемый. Огромное спасибо! - person SebastianG; 13.09.2019