Возврат не работает с Observable.toPromise () в canActivate: Angular 4 - PullRequest
0 голосов
/ 01 мая 2018

Я добавил охрану маршрута, чтобы проверить, прошел ли пользователь аутентификацию и может ли он войти в приложение. Ниже приведен фрагмент кода, который показывает, как у меня есть 2 различных условия для обработки, если пользователь аутентифицирован или нет:

if (this.adal.user.isAuthenticated) {
  return true;
} else {
  this.adal.acquireToken(clientId).toPromise().then((data) => {
    console.log('Refreshed the token.');
    return(true);
  }).catch ((error) => {
     console.log('No user logged in.');
     this.router.navigate(['/login']);
     return(false);
  });
}

Проблема в том, что когда вызывается другая часть кода, то есть вызывается acquToken (), она возвращает наблюдаемую часть, которую я конвертирую в обещание. Как только токен обновлен, я возвращаю истину. Но я вижу пустую страницу, когда это происходит, как будто «return true» никогда не вызывается. Не уверен, почему это происходит, может быть, то, как я использую метод toPromise, не правильно. Было бы здорово, если бы кто-нибудь дал мне небольшой совет по этому поводу.

1 Ответ

0 голосов
/ 01 мая 2018

В соответствии с определением интерфейса , CanActivate может вернуть Observable, Promise или Boolean, но не подписку:

interface CanActivate {    
   canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
     Observable<boolean> | Promise<boolean> | boolean 
}

Вы можете изменить свой код следующим образом:

if (this.adal.user.isAuthenticated) {
  return of(true);
} else {
  this.adal.acquireToken(clientId).pipe(map(() => true))
  .catch ((error) => {
     console.log('No user logged in.');
     this.router.navigate(['/login']);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...