У меня есть наблюдаемое в сервисе:
hasAccess$: Observable<boolean>;
Это назначается в отдельном компоненте. Он содержит filter()
и никогда не будет выдавать ложь, только истину. Так что если оно ложно, оно не излучает.
Мне нужно использовать его в охране маршрута. Итак, я попробовал:
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> {
return this.service.hasAccess$.pipe(
defaultIfEmpty(false),
tap(access => {
console.log({access}); // never logs
}),
first()
);
}
- Я использовал
defaultIfEmpty()
, чтобы обеспечить выдачу значения
- Я использовал
tap()
, чтобы регистрировать, если что-то случается (этого не происходит)
- Я использовал
first()
, потому что наблюдаемые, возвращаемые в охранниках , должны завершиться .
Я гарантировал, что this.service.hasAccess$
будет назначен. Выдает ошибку, если это не так, потому что вы не можете передать неопределенное. Там нет ошибки. Теперь странная вещь, это испускает ложь:
return of().pipe(
defaultIfEmpty(false),
tap(access => {
console.log({access});
}),
first()
);
Оба переданы по каналу defaultIfEmpty(false)
. Почему охранник не излучает?
Обновление : Спасибо @martin за указание, что defaultIfEmpty()
испускается только после завершения. Также теперь я понимаю, что first()
не завершит работу, если ничего не испустит. Я думаю, мне нужно выяснить, как сделать его завершенным, когда он ничего не излучает.