我的代码中有类似
的内容class AuthenticationGuard implements CanActivate
async canActivate(...) {
console.log('canActivate....1');
const currentRole = this.settings.getCurrentRole();
if (!currentRole)
console.log('canActivate....2');
currentRole=await this.service.fetchAuthRoleFromServer(url);
在AuthenticationService中我有之类的东西
class AuthenticationService{
constructor(sett:settings){
sett.initData(...);
并在设置类中:
class settings
async initData(...){
console.log('initData....1');
const role = await roleService.getAuthenticated();
console.log('initData....2');
this.setCurrentRole(role);
console.log('initData....3');
并且日志文件最终看起来像
initData....1
canActivate....1
canActivate....2
initData....2
initData....3
有没有办法锁定方法this.settings.getCurrentRole()
,直到至少我已达到initData....3
(在同一个班级[settings
]内)?
我尝试了一些关于信号量的调查,但不知何故无法让它们运行(在Angular中)......要么我安装了错误的软件包还是......但也许有更合适的解决方案......
更新 经过一些研究后我发现这个问题与保护路由机制高度相关,事实上我需要初始化一些数据,而在canActivate中我需要检查已经登录。如果不是取得内容或者转到登录页面。但无论如何,这种机制很奇怪。
答案 0 :(得分:0)
适用于Angular 2/4,and for AngularJS
您可以在“初始化”中添加行为主题' function(可以是布尔值或数字):
class settings
isInitDone = new BehaviorSubject<boolean>(false);
async initDate(...){
console.log('initData....1');
const role = await roleService.getAuthenticated();
console.log('initData....2');
this.setCurrentRole(role);
console.log('initData....3');
//give a new value to this subject
this.isInitDone.next(true);
}
这将要求Auth类订阅此主题的更改:
class Auth...
async canActivate(...) {
console.log('canActivate....1');
this.settings.isInitDone.subscribe(isAvailable => {
if (isAvailable) {
//Do your stuff
}
});