组合两个 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 管道自动跟踪角色。
我有两个 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 管道自动跟踪角色。