I am new in Angular, I need to implement a function that returns true/false, I going to use the return in canActivate guard, but this function consumes a api by http.get, so like the communication is asynchronous this function always return FALSE, because http.get yet is in process.
My class guard:
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;
}
and function isLoggedIn()
isLoggedIn() {
    let logged: boolean = false;
    this.http.get('api/values', this.httpService.headers())
        .map((res: Response) => {
            logged = res.json();
        });
    return logged;
}
I read many questions, but I don't found the answer.
guard typings says it can return
Observable<boolean>, Promise<boolean> or boolean
so change isLoggedIn to:
isLoggedIn() {
  return this.http.get('api/values', this.httpService.headers())
    .take(1)
    .map((res: Response) => res.json());
}    
update
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;
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With