Возвращать логическое значение вместо подписки на canActivate

У меня есть компонент, защищенный с помощью canActivate guard. Автогвардия в checkLogin Функция подписывается из наблюдаемой, но я не знаю, как вернуть логическое значение из нее в canActivate.

guard.service.ts

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
    let url: string = state.url;

    return this.checkLogin(url);
  }

    public checkService:boolean;
  checkLogin(url: string):boolean {

         return this.loadAppSettings().subscribe(res=>{
              console.log(this.checkservice);
              if (this.checkservice == true) 
              {
                   return true; 
            }
            else{
                this.router.navigate(['/error-user']);
                return false;
            }
            });
      }//checkLogin throws error as type subscription is not assignable to type boolean

Так что я хочу, если this.checkService Значение true, оно должно просто возвращать значение true, и пользователь должен иметь возможность приземлиться на охраняемом маршруте, но если значение равно false, ему следует перейти к error-user,

Angular2 - вернуть логическое значение с подпиской на canActivate этот вопрос похож на мой, но не смог решить мою проблему с ним.

Может ли кто-нибудь помочь здесь.

2 ответа

Решение

canActivate также может возвращать наблюдаемое, см. определение CanActivate-interface. Просто измените ваши типы возврата соответственно.

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    let url: string = state.url;

    return this.checkLogin(url);
}

public checkService:boolean;
checkLogin(url: string):Observable<boolean> {
     return this.loadAppSettings().map(res=>{
          console.log(this.checkservice);
          if (this.checkservice == true) 
          {
               return true; 
        }
        else{
            this.router.navigate(['/error-user']);
            return false;
        }
    });
  }

Мы также можем вернуть Promise, например...

        canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Promise<boolean> {
    return new Promise<boolean>(resolve => {
       this.service
       .function()
       .toPromise()
       .then((res) => {
         if(condition) {
            resolve(true);
         } else {
            this.router.navigate(["login"]);
            resolve(false); 
         } 
      })
      .catch(() => {
        this.router.navigate(["login"]);
        resolve(false);
       });
    });
  }
Другие вопросы по тегам