组合两个 Oservables,确保一个,在第二个对变化做出反应

Combine two Oservables, ensure one, react to changes in second

我有两个 hot/warm 可观察对象,一个提供用户角色定义列表,另一个提供用户列表(在幕后,这些 ReplaySubject(1) 的工作方式类似于没有起始值的 BehaviorSubject)。

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

我想利用 rxjs 的强大功能并将这两个可观察对象结合起来以获得我描述的语义。我尝试了许多运算符,如 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;
        })
      }
 });

通过这种方式,我可以确保在尝试呈现用户之前拥有角色,并且只要用户和角色发生变化,它就会更新它们。

最有前途的是 zip 运算符,但是当只有一个可观察到的变化时它不会触发。 SwitchMap 运算符仅在第一个可观察对象具有新值时才会触发(因此我仅在用户或用户角色更改时获得更新)。

看起来您正在寻找 combineLatest,当任何源 Observables 在每个源 Observables 发出至少一个值(它具有静态和运算符变体)后发出时发出。

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

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

也许还可以看看 withLatestFrom

您还可以创建类型用户

导出 class 用户{

角色:角色[];

}

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