下面是我的代码,我要做的是尝试将返回值直接转换为canActivate返回,但问题是它会在运行之前先运行检查" this._authService.isAdmin(token)& #34;方法。我知道这是因为异步。但是如何预防呢?我已经有了想法。提前谢谢。
我已经尝试将该方法放在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;
}
}
答案 0 :(得分:0)
您可以使用pipeable operators:
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运算符只执行“副作用任务”。 tap
运算符返回的observable与之前的运算符相同。现在,只有在isAdmin observable发出事件后,才会评估点按操作符中的if isAdmin
检查。