检查observable是否完整

时间:2017-03-21 11:28:45

标签: angular typescript rxjs

我正在尝试授权用户查看某个路由器路径。

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.userService.isAdmin() || this.userService.isEmployee()
}

UserService方法是同步的。 UserService是singleton,它从后端加载用户数据。当用户经历正常的应用程序流程时,这不是问题。但是当用户试图直接进入受保护的路径路径时,可能无法及时加载UserService信息,从而导致错误

EXCEPTION: Uncaught (in promise): TypeError: Cannot read property 'roleId' of undefined
TypeError: Cannot read property 'roleId' of undefined

这是UserService代码

@Injectable()
export class UserService {
  public $user;
  public loggedUser;

  constructor(private loginService: ResourceLoginService) {
    this.$user = this.loginService.get().$observable;
    this.$user.subscribe(response => {
      this.loggedUser = response;
    });
  }

  isAdmin(): boolean {
    return this.loggedUser.roleId === 1;
  }

我基本上想订阅$ user并调用方法async如果还没有完成,或者调用方法,如果它已经完成了CanActive后卫。采用这种方法的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以删除The above details are only for understanding marshaling and unmarshaling process using tools in Jax-B API.的订阅并写入:

For more details , check below examples

对于user$,您可以返回: isAdmin(): boolean { return this.user$ .map(user => user.roleId === 1); } ,它会在解析路由权限之前等待Promise / Observable。

答案 1 :(得分:0)

解决方案是函数应该返回一致的类型,无论如何。如果其中一个case是同步的,另一个异步函数需要从同步源返回async observable。

export class UserService {
  public $user;
  public loggedUser;

  constructor(private loginService: ResourceLoginService) {
    this.$user = this.loginService.get().$observable;
    this.$user.subscribe(response => this.loggedUser = response);
  }

  isAdmin(): Observable<boolean> {
    if (this.loggedUser) {
      return Observable.of(this.loggedUser.roleId === 1);
    } else
      return this.$user
        .map(user => user.roleId === 1);
  }