私はAngularを初めて使用し、true/falseを返す関数を実装する必要があります。canActivateguardでreturnを使用しますが、この関数はhttp.getによるAPIを使用するため、通信が非同期であるように、この関数は常にFALSEを返します。 、http.getはまだ処理中であるため。
私のクラスガード:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
if (this.loginService.isLoggedIn()) {
return true;
}
this.loginService.redirectUrl = url;
this.router.navigate(['login']);
return false;
}
および関数isLoggedIn()
isLoggedIn() {
let logged: boolean = false;
this.http.get('api/values', this.httpService.headers())
.map((res: Response) => {
logged = res.json();
});
return logged;
}
たくさんの質問を読みましたが、答えが見つかりません。
ガードタイピングはそれが戻ることができると言います
Observable<boolean>, Promise<boolean> or boolean
したがって、isLoggedInを次のように変更します。
isLoggedIn() {
return this.http.get('api/values', this.httpService.headers())
.take(1)
.map((res: Response) => res.json());
}
更新
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.isLoggedIn().map(loggedIn => {
if(!loggedIn) {
this.loginService.redirectUrl = url;
this.router.navigate(['login']);
}
return loggedIn;
}
}