【发布时间】:2021-05-21 11:35:46
【问题描述】:
我有一个 Angular 应用程序,其中包含一个 UserService 和一个守卫。该守卫正在使用 UserService 创建一个用户,并根据其角色使用该用户来决定返回 true 或 false。见以下代码:
这是警卫:
canActivate(): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return new Observable<boolean>(obs => {
this.userService.getUser().subscribe(user => {
if (user.roles.includes(Roles.IT_PROFESSIONAL)) {
obs.next(true);
} else {
this.router.navigate(['/']);
obs.next(false);
}
});
});
}
这是 UserService 类:
private static user: User;
public getUser(): Observable<User> {
if (!UserService.user) {
UserService.user = new User();
this.getGroups()
.subscribe((response: any) => {
response.value.map((v: any) => {
this.setRol(v); // use v to push v to the role array of the user
});
return of(UserService.user);
});
}
else{
return of(UserService.user);
}
}
private getGroups(): Observable<any> { // Get groups for user
return this.http.get("https://graph.microsoft.com/v1.0/me/memberOf");
}
当我运行应用程序时,它显示“无法读取未定义的属性‘订阅’”。问题是守卫订阅了 getUser observable,但这让我立即获得了用户 observable。为什么不等待UserService返回用户返回“(UserService.user)”语句?
【问题讨论】:
-
感谢您的回答!现在它在 setRole 方法中说“无法设置未定义的属性'角色'”,它基本上是这样做的:“ if(v.mailNickname == "Employees") { UserService.user.roles = [Roles.IT_PROFESSIONAL]; }"
标签: angular typescript events rxjs