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;
    }
}
Другие вопросы по тегам