Ожидание при наблюдаемой подписке Angelar2

#javascript #angular #observable #angular-http

#javascript #угловой #наблюдаемый #angular-http

Вопрос:

В моем приложении Angular2 я использую canActivate для разрешения доступа к страницам. Часть этого заключается в том, чтобы проверить на сервере, что токен не был подделан, поэтому, прежде чем я смогу решить, может ли пользователю быть предоставлен доступ, мне нужно вызвать мой api. Это означает подписку на наблюдаемый и ожидание ответа.

Мне нужно вернуть true или false, но поскольку я выполняю вызов asyns, я не могу вернуться на основе моего ответа. Я понимаю, что не могу ждать, поскольку он однопоточный, но мне нужно как-то заблокировать, пока я не получу ответ от api. мой canActivate выглядит следующим образом:

 canActivate() {
   this.guardClient.checkToken("token")
  .subscribe(response => {
    let responseText = response.text().replace(/"/g, '');
    if ( responseText === 'Ok')
    {
      return true;
    }
    if(responseText === 'denied') {

      this.router.navigate(['login']); // redirecting to login
      return false;
    }
  });
}
  

Может кто-нибудь сказать мне, как решить эту проблему??

Ответ №1:

При просмотре интерфейса canActivate в angular 2 я вижу следующее:

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

Как вы можете видеть, вы также можете просто вернуть наблюдаемое, а не просто логическое значение.
Это означает, что ваш код может быть переписан примерно так.

 canActivate() {
 return this.guardClient.checkToken("token")
   .map(response => {
     let responseText = response.text().replace(/"/g, '');
     if ( responseText === '  Ok')
      {
       return true;
      }
     if(responseText === 'denied') {
        this.router.navigate(['login']); // redirecting to login
        return false;
   }
 });
}
  

Это заставит Angular ждать разрешения наблюдаемого, прежде чем решить, можно ли показывать маршрут или нет.
Обратите внимание, что этот метод должен быть довольно быстрым, чтобы избежать медленной загрузки.

Комментарии:

1. Спасибо, что сделал это! 🙂