结合两个Oservable,确保一个,对第二个变化作出反应

Seb*_*zyk 2 rxjs rxjs5 angular

我有两个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;
        })
      }
 });
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*tin 5

combineLatest当任何源Observable发出至少一个值(它同时具有静态变量和运算符变量)之后,看起来你正在寻找发出的东西.

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

Observable.combineLatest(
    this.userRoleStore.observable,
    this.userStore.observable
  )
  .subscribe(([role, user]) => ...);
Run Code Online (Sandbox Code Playgroud)

也许还有看看withLatestFrom.