Если вы хотите сделать запрос Http внутри вашей функции canActivate
, вам нужно вернуть Observable<boolean>
вместо boolean
, поскольку вы сейчас выполняете асинхронное действие.
И так как если вы хотите перейти в случае сбоя, вы должны вернуть Observable<boolean | UrlTree>
.
Простая версия
constructor(private router: Router) { }
canActivate(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> {
return this.http.post(url, body).pipe(
map((resp: any) => resp.success ? true : this.router.parseUrl('/path'))
);
}
Мы возвращаем наблюдаемый http-запрос (маршрутизатор вызовет его, подписавшись), и сопоставив ответ либо с
true
- маршрутизатор может перейти к защищенному маршруту UrlTree
- маршрутизатор должен перейти к маршруту, который мы возвратили
Применительно к вашему примеру
Если мы применим это к вашему примеру, нам нужно проделать немного больше работы в конвейере, так как у вас есть дополнительный сервисный вызов.
// TODO: inject other services
constructor(private router: Router) { }
canActivate(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> {
const userEmail = route.paramMap.get('email');
// I am assuming this is a synchronous call
userEmail = this._utilityService.decryptMsgByCryptoJs(userEmail);
const url = this._const.userResetPasswordLinkExpiry;
const body = { email: userEmail };
return this._dataService.post(url, body).pipe(
// initial map from response to true/false
map((resp: any) => resp.success),
// perform an action if false
tap(success => {
if (!success) {
// I'm assuming this is synchronous. If not, you will need to do a switchMap
this._dataService.exhangeResetPasswordObsMsg({ event: 'linkExpired' });
}
}),
// final map to boolean | UrlTree
map(success => success ? true : this.router.parseUrl('/login'))
);
}
Есть некоторые сервисные вызовы, которые, я полагаю, являются синхронными. Этот ответ демонстрирует, как вы выполняете асинхронный вызов внутри canActivate
и либо позволяете маршрутизатору перемещаться, либо возвращаете альтернативный маршрут для навигации.