链可观察和承诺

时间:2018-09-09 12:05:58

标签: angular rxjs6

我正在将Firebase Auth(AngularFire)与Angular 6结合使用来构建应用程序。我还具有用于角色库访问(RBA)的MongoDB服务

为了确定用户是否可以访问URL路径,我需要做三件事:

  1. 收听当前用户可观察到的Firebase authState
  2. 获取他的最新令牌ID
  3. 检查MongoDB是否允许用户访问URL

所有3次通过后,它应返回true

我对Observables进行了一些研究,但仍然感到困惑,特别是因为我使用的是rxjs 6,并且很多链接仍引用5.5之前的版本

这是我现在的canActivate函数:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) 
{

     return this.authService.user$.pipe(map (user => {

         //user.getIdToken() returns a Promise so I wrap it in an Observable
         return from(user.getIdToken());

     })).pipe(map( tokenValue => {

          //tokenValue is an Observable here 
          this.mongoDBService.validate(tokenValue, state.url);
     }));
}

我期望第二个“管道”监听并接收from(user.getIdToken())的结果

这不是应该如何工作的吗?如果没有,有人可以指导我如何将这两个可观察物链接在一起吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您需要使用switchMap(将可观察到的结果链接到主流程中)而不是map(将发出的值简单地映射到其他内容)。另外,您只能使用一次管道:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  return this.authService.user$.pipe(
    switchMap (user => from(user.getIdToken())),
    switchMap(tokenValue => this.mongoDBService.validate(tokenValue, state.url))
  );
}

我不确定user.getIdToken()是什么,是否完全需要from。但是,您的主要问题应通过此方法解决。