Другой вызов GET перед выполнением метода обещания в Angular 7 - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в работе с Angular 7 и столкнулся с проблемой, которую не могу понять, почему это происходит.

Я хочу после каждого перенаправления RouteGuard проверит, является ли токен действительным илине.Для этого я написал следующий сервис:

 getUserClaims():Promise<any> {
    /*return new Promise((resolve, reject) => {
      this._http.get(ALCA_Utility.API_BASE_URL + 'User/GetCurrentUser')
        .toPromise()
        .then(
          res => { // Success

            resolve(res)
          }
        );
    });*/

     return this._http.get(ALCA_Utility.API_BASE_URL + 'User/GetCurrentUser')
       .toPromise();
  }

Я испробовал оба подхода, (я комментирую вышеупомянутый подход, а также использую HTTP_INTERCEPTORS для перехвата HTTP-вызовов и добавления токена взаголовок авторизации) .

Ниже приведен метод canActive;

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean {

    if (sessionStorage.getItem('userToken') != null) {

      this._auth.getUserClaims().then((data) => {
        if (data.PK_UserID != null && data.PK_UserID > 0) {
          alert(1)

          return true
        }
        else{
          alert(2)      
          return false
        }
        alert(3)      

      })
      alert(4)      
    }
    else {      
      this._router.navigate(['/login']);
      return false;
    }
  }

Я думал, что методы будут выполняться последовательно в canActive, однако он показывает предупреждение4 затем 1, 2, 3.

Я не понимаю, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Пожалуйста, проверьте следующую реализацию:

@Injectable()
export class LoggedInGuard implements CanActivate {

  constructor(private router: Router) {  }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
    return userService.isAuthenticated().then(result => {
      if (result) return true;
      UserLoginService.setPreviousUrl(state.url);
      this.router.navigate(['login']);

      return false;
    }).catch(message => {
      userService.setPreviousUrl(state.url);
      this.router.navigate(['login']);

      return false;
    });
  }
}

для вашего случая проверьте следующее:

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> | boolean {
    if (sessionStorage.getItem('userToken') != null) {
      return this._auth.getUserClaims().then(data => {
        if (data.PK_UserID != null && data.PK_UserID > 0) {
          return true;
        } else {
          return false;
        }
      });
    } else {
      this._router.navigate(['/login']);
      return false;
    }
  }

Пожалуйста, обратите внимание на тип возврата canActivate

Promise<boolean> | boolean
0 голосов
/ 23 февраля 2019

это асинхронный вызов, когда вы делаете http.get в обещании.для меня это нормально, вы видите сначала 4, а затем остальные.Вы получаете «обещание», что где-то вовремя вы можете или не можете получить ответ на звонок.В вашей программе я не вижу необходимости иметь предупреждение 4. Единственное, что вы можете сделать, это ловить ошибки

...