我有两个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运算符(因此我只获得有关用户或用户角色更改的更新)。
答案 0 :(得分:5)
看起来你正在寻找combineLatest
当任何一个源Observable在它们每个发出至少一个值(它有静态变量和运算符变体)之后发出的时候发出的。{/ p>
所以在你的情况下,它看起来像这样:
Observable.combineLatest(
this.userRoleStore.observable,
this.userStore.observable
)
.subscribe(([role, user]) => ...);
也许还要看看withLatestFrom
。
答案 1 :(得分:0)
您还可以创建类型用户
导出类用户{
角色:角色[];
}
现在您可以使用异步管道来自动跟踪角色。