Мой ngOnInit
метод моего корня AppComponent
выполняет некоторую аутентификацию следующим образом:
token: SessionToken;
authenticated: boolean;
constructor(
private authService: AuthenticationService,
private router: Router) {}
ngOnInit() {
this.authService.authenticate().subscribe(token => {
if (token != null) {
// authenticated
this.token = token;
this.authenticated = true;
} else {
// not authenticated
this.authenticated = false;
}
});
}
Вот мой authenticate
метод в authService
:
// Authenticate user. Returns non-null token if authenticated, null token otherwise.
token: MyCustomToken;
authenticate(): Observable<MyCustomToken> {
return this.http.get<SessionToken>(this.url)
.pipe(
tap(token => this.token = token),
catchError(this.handleError<SessionToken>('authenticate'))
);
}
Затем в той же службе у меня также есть другой метод, который проверяет, прошел ли пользователь проверку подлинности, проверяя, был ли токен, возвращенный из вызова authenticate
, нулевым или нет:
public isAuthenticated(): boolean {
if (this.token != null) {
return true;
} else {
return false;
}
}
Наконец,в моем методе canActivate
моего охранника аутентификации я хочу вызвать этот метод isAuthenticated
, чтобы проверить, прошел ли аутентификация пользователя перед отображением страницы:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>|boolean {
console.log("in canActivate() of authentication guard.");
let val = this.authService.isAuthenticated();
console.log(`Is authenticated? ${val}`); // printing false, even though the server returned a non-null token when I called authenticate in AppComponent
return val;
}
Проблема в том, что this.authService.isAuthenticated()
вcanActivate
метод возвращает false, даже если сервер возвратил ненулевой токен, когда я вызвал authenticate в AppComponent.
Кажется, что происходит canActivate
вызывается до токен возвращается с сервера при вызове authenticate
в AppComponent
, потому что authenticate
является асинхронным вызовом.
Так есть ли способ подождать, покаасинхронный вызов для завершения или какой-либо другойобходной путь?