Возвращаемое значение подписаться напрямую в canActivate auth guard

Ниже приведен мой код, и я пытаюсь получить возвращаемое значение непосредственно в возвращение canActivate, но проблема в том, что он сначала запустит проверку перед запуском метода "this._authService.isAdmin(token)". Я знаю это так из-за асинхронности. Но как это предотвратить? У меня уже есть идея. заранее спасибо.

я уже пытаюсь поставить этот метод на construtor, но результат все тот же.

import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { AuthenticationService } from "../_services/authentication.service";

@Injectable()
export class AdminGuard implements CanActivate  {

  isAdmin: boolean = false;

  constructor(
    private _authService: AuthenticationService,
    private router: Router) {
  }

  canActivate(): Observable<boolean> | Promise<boolean> | boolean {

  var token = this._authService.getJwtToken();
  this._authService.isAdmin(token).subscribe(
     res => {
            //res will return true or false value
            this.isAdmin = res;
     }
  );

  if(this.isAdmin){
    return true;
  }
  this.router.navigate(['/']);
  return false;

  }
}

1 ответ

Вы можете использовать конвейерные операторы для этого:

canActivate(): Observable<boolean> {
  let token = this._authService.getJwtToken();
  return this._authService.isAdmin(token).pipe(
    tap(isAdmin => {
      if (isAdmin) {
        this.router.navigate(['/']);
      }
    })
  );
}

// Usage:
canActivate.subscribe(value => {
  // do something...
});

Обратите внимание, что оператор касания просто выполняет "задачу побочного эффекта". Возвращенные наблюдаемые от tap Оператор такой же, как предыдущий. Теперь if isAdmin проверка в операторе касания оценивается только после того, как наблюдаемый объект isAdmin отправляет событие.

Другие вопросы по тегам