合并两个Oservable,确保一个,对第二个

时间:2018-02-05 10:34:23

标签: angular rxjs rxjs5

我有两个hot / warm observable,一个提供用户角色定义列表和第二个用户列表(这些ReplaySubject(1)的工作方式类似于BehaviorSubject而没有起始值)。

要显示用户,我需要确保我有角色定义列表。此外,如果角色列表更改或用户更改列表,我必须重新呈现列表。

我想使用rxjs的强大功能并结合这两个observable来获取我描述的语义。我尝试了许多运算符,如switchMap,mergeMap,faltMap,forkJoin和zip但是我无法使它工作。

我能使它工作的唯一方法是使用两个这样的订阅:

 this.userRoleStore.observable.subscribe((roles) => {
      this.roles = roles;
      if (this.users == null) {
        this.userStore.observable.subscribe(users => {
          this.users = users;
        })
      }
 });

这样我确保在尝试渲染用户之前就拥有了角色,并且只要用户和角色发生变化,它就会更新。

最有希望的是拉链操作符,但是当只有一个可观察到的变化时它不会触发。只有当第一个observable具有新值时才会触发SwitchMap运算符(因此我只获得有关用户或用户角色更改的更新)。

2 个答案:

答案 0 :(得分:5)

看起来你正在寻找combineLatest当任何一个源Observable在它们每个发出至少一个值(它有静态变量和运算符变体)之后发出的时候发出的。{/ p>

所以在你的情况下,它看起来像这样:

Observable.combineLatest(
    this.userRoleStore.observable,
    this.userStore.observable
  )
  .subscribe(([role, user]) => ...);

也许还要看看withLatestFrom

答案 1 :(得分:0)

您还可以创建类型用户

导出类用户{

角色:角色[];

}

现在您可以使用异步管道来自动跟踪角色。