Angular 角度5可观察到需要等到它';斯科姆佩特酒店

Angular 角度5可观察到需要等到它';斯科姆佩特酒店,angular,observable,Angular,Observable,在调用checkPermissions()方法之前,我需要等待getPermissions()observable完成。但就我的生命而言,我无法得到它 我也尝试过使用async/await,但这似乎对我也不起作用 我需要有我的权限,才能检查它们,对吗。想法 如果有更好的办法,我洗耳恭听 非常感谢 从'@angular/core'导入{Injectable}; 从'@angular/Router'导入{Router,CanActivate,ActivatedRouteSnapshot}; 从“/

在调用checkPermissions()方法之前,我需要等待getPermissions()observable完成。但就我的生命而言,我无法得到它

我也尝试过使用async/await,但这似乎对我也不起作用

我需要有我的权限,才能检查它们,对吗。想法

如果有更好的办法,我洗耳恭听

非常感谢

从'@angular/core'导入{Injectable};
从'@angular/Router'导入{Router,CanActivate,ActivatedRouteSnapshot};
从“/auth.service”导入{AuthService};
@可注射()
导出类RoleGuardService实现CanActivate{
构造函数(公共身份验证:身份验证服务,公共路由器:路由器){}
canActivate(路由:ActivatedRouteSnapshot):布尔值{
//这将从数据属性上的路由配置传递
const expectedRole=route.data.expectedRole;
var hasPerm=this.loadAndCheckPermissions(expectedRole);
log('done!'+hasPerm);
返回hasPerm;
}
loadAndCheckPermissions(expectedRole){
var hasPermission=false;
localStorage.clear();
var myPermissions=localStorage.getItem('user-permissions');
如果(myPermissions==null){
log(“来自服务器的权限!”);
//你不能等待一个可观察到的或承诺完成。
//您只能订阅它以在它完成或发出事件时获得通知。
this.auth.getPermissions()
.订阅(res=>{
setItem('user-permissions',JSON.stringify(res.body));
//现在检查权限
//hasPermission=this.checkPermissions(expectedRole);
});
}否则{
hasPermission=this.checkPermissions(expectedRole);
}
log('loadAndCheckPermissions'+hasPermission);
未经许可返回;
}
//在这里检查权限
检查权限(expectedRole){
返回此.auth.checkPermission(expectedRole);
}

}
您可以在canActivate方法中返回一个可观察的,如下所示:

从'@angular/core'导入{Injectable};
从'@angular/Router'导入{Router,CanActivate,ActivatedRouteSnapshot};
从“/auth.service”导入{AuthService};
@可注射()
导出类RoleGuardService实现CanActivate{
建造师(
公共授权:授权服务,
公共路由器
) { }
canActivate(路由:ActivatedRouteSnapshot):可观察{
//这将从数据属性上的路由配置传递
const expectedRole=route.data.expectedRole;
var hasPerm=this.loadAndCheckPermissions(expectedRole);
log('done!'+hasPerm);
返回hasPerm;
}
loadAndCheckPermissions(expectedRole):可观察{
var hasPermission:Observable=of(false)的可观测值;
//清楚的
localStorage.clear();
//吸气剂
var myPermissions=localStorage.getItem('user-permissions');
//
如果(myPermissions==null){
log(“来自服务器的权限!”);
hasPermission=this.auth.getPermissions()
.map(res=>{
setItem('user-permissions',JSON.stringify(res.body));
log('returnfromsync');
//检查返回布尔值的权限
返回此。检查权限(expectedRole);
});
}
否则{
hasPermission=Obsersable.of(this.checkPermissions(expectedRole));
}
//log('loadAndCheckPermissions'+hasPermission);
未经许可返回;
}
//在这里检查权限
检查权限(expectedRole){
返回此.auth.checkPermission(expectedRole);
}
}
根据角度的记录,路由保护可以返回一个可观察到的或承诺,路由器将等待可观察到的解析为真或假


loadAndCheckPermissions
应该是可观察的,与
canActivate
相同。如果你有更高的函数依赖于它们返回的内容,那么你要么需要组合函数,要么继续声明子函数为可观察函数。我不认为在
可观察的
上打耳光就能解决问题。您需要声明一个
观察者
,并使用
观察者.next()
返回值,如示例所示。这些示例没有使用角度API的可观察性,也没有下一个方法。这也不起作用,因为两者都已完成!和loadAndCheckPermissions console.log()在异步调用完成之前返回。为什么需要等待异步调用?如果您只想实现一个canActivate guard,它可以作为异步调用的结果返回一个Observable,因为路由器将等待Observable解析为true或false。在可观察(异步调用)完成之前,路由不会被激活。标记,请参见以下答案: