链式 Observable 和 Promises

Chain Observables and Promises

我正在使用 Firebase Auth (AngularFire) 和 Angular6 构建一个应用程序。我还有一个 MongoDB 角色基础访问 (RBA) 服务

我需要做 3 件事来解决用户是否可以访问 URL 路径:

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

当所有 3 个都通过时,它应该 return true

我研究了一些 Observables 但仍然感到困惑,特别是因为我使用的是 rxjs 6 并且很多链接仍然引用 before-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);
     }));
}

我期待第二个 "pipe" 能够收听并接收 from(user.getIdToken())

的结果

这不应该是这样吗?如果没有,有人可以指导我如何将这 2 个 observable 链接在一起吗?

谢谢

您需要使用 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。但是你的主要问题应该通过这个解决。