Похоже, есть несколько проблем с тем, что вы опубликовали.
Обновление: Изначально я думал, что вы использовали старый выбор rxjs, но это было неправильно.Убедитесь, что вы используете select from ngrx с таким импортом:
import { select } from '@ngrx/store';
Если вам требуется canActivate()
для возврата Observable, не объявляйте его так:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
, а лучше объявить это так:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
Еще один проблемный раздел:
map((state: IState) => {
this.router.navigate(['/', url]);
}),
Прежде всего, он не возвращаетсячто угодно, поэтому он разрывает наблюдаемую цепочку - возможно, самое простое решение - просто удалить фигурные скобки, чтобы он возвращал значение из this.router.navigate()
.Но в этом разделе есть вторая проблема: this.router.navigate
возвращает обещание, а не наблюдаемое, поэтому, если вы хотите использовать его в наблюдаемой цепочке, вам нужно заключить его в from
.Наконец, так как это само по себе Observable и возвращает Observable, вы захотите использовать такой оператор, как mergeMap
или switchMap
в зависимости от ваших потребностей.
Я не уверен, что вы пытаетесьсделать в пределах catchError
, поэтому я оставил это в покое, но вы захотите проверить это в случае ошибки, чтобы убедиться, что она работает так, как вы ожидаете.
Я также нашел ваш текущий отступ довольносбивает с толку.
Наконец, вы не опубликовали детали того, как this.store
выглядит в вашей конкретной реализации.Будьте уверены, это возвращает наблюдаемое!:)
Соберите все это вместе, и один возможный рефакторинг может выглядеть так:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
this.store.dispatch(new Action());
return this.store.pipe(
select<IAppState>(getMainState),
mergeMap((state: IState) =>
from(this.router.navigate(['/', url]))
),
catchError((a, b) => {
this.router.navigate(['/', 'error']);
return of(false);
}),
);
}
Я менее чем на 50% уверен, что это будет работать как есть, однако из-за всех неизвестныхЯ подробно изложил выше.Я надеюсь, что это поможет, по крайней мере, указать вам верное направление поиска ответа.