Angular 组合两个OServable,确保其中一个在第二秒内对更改做出反应

Angular 组合两个OServable,确保其中一个在第二秒内对更改做出反应,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我有两个热/热的观察对象,一个提供用户角色定义列表,另一个提供用户列表(在引擎盖下,这些ReplaySubject(1)与BehaviorSubject类似,没有起始值) 要显示用户,我需要确保有角色定义列表。此外,如果角色列表或用户列表发生变化,我必须重新呈现列表 我想使用rxjs的强大功能,并结合这两个观察值来获得我描述的语义。我尝试了很多操作符,比如switchMap、mergeMap、faltMap、forkJoin和zip,但是我无法让它工作 我能让它工作的唯一方法是使用以下两种订阅:

我有两个热/热的观察对象,一个提供用户角色定义列表,另一个提供用户列表(在引擎盖下,这些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操作符只有在第一个观察对象具有新值时才会触发(所以我只会在用户或用户角色更改时获得更新)

看起来您正在寻找当任何源观测值在每个源观测值发出至少一个值后发出时发出的值(它有静态变量和运算符变量)

因此,在您的情况下,它将如下所示:

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

也许还可以看看。

您还可以创建一个用户类型

导出类用户{

角色:角色[]

}

现在,您可以使用一个异步管道,它将自动跟踪角色