O serviço AuthenticationManager
possui o seguinte código:
private loggedIn: BehaviorSubject<boolean>; constructor( private http: ApplicationHttpClient, private router: Router, private a: HttpClient) { this.loggedIn = new BehaviorSubject<boolean>(false); } isLoggedIn():Observable<boolean> { return this.loggedIn.asObservable(); } initSession():void { this.getUserSession().subscribe( response => { this.loggedIn.next(true); } ); } getUserSession():Observable<any> { return this.a.get('http://localhost/api/v1/usersession', {}); }
O método initSession
é chamado pelo app.component.ts
para consultar a API e obter a sessão do utilizador.
A rota possui o canLoad
configurado:
//... canLoad: [AccessManagerGuard] //...
O AccessManagerGuard
possui o seguinte código:
canLoad(route: Route): Observable<boolean>|Promise<boolean>|boolean { return this.AuthenticationManager.isLoggedIn() .map((isLoggedIn: boolean) => { if (!isLoggedIn) return false; return true; }); }
Repare que o canLoad
executa o isLoggedIn
que por sua vez retorna um Observable
.
isLoggedIn():Observable<boolean> { return this.loggedIn.asObservable(); }
Dessa forma o canLoad
não funciona, uma vez que a variável loggedIn
é iniciada com o valor false
.
Percebo que o método isLoggedIn
devolve de imediato o valor false
porém preciso que aguarde o resultado do método getUserSession
.
Como faço para que o método isLoggedIn
aguarde a resposta do método getUserSession
?