Angular2 - вернуть логическое значение с подпиской на canActivate
Я новичок в Angular, мне нужно реализовать функцию, которая возвращает true/false, я собираюсь использовать return в canActivate guard, но эта функция потребляет API от http.get, поэтому, как и при асинхронном обмене данными, эта функция всегда возвращает 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;
}
Я прочитал много вопросов, но не нашел ответа.
1 ответ
Решение
Охранник печатает говорит, что может вернуться
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;
}
}