Возвращаемое значение подписаться напрямую в 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 отправляет событие.