RxJS在分区后保持秩序
我有一个RxJS在分区后保持秩序,rxjs,Rxjs,我有一个可观察的,它会发出钥匙。键的某些值在本地可用,有些值需要从后端检索。我将可观测数据拆分为: const [keysLocal, keysServer] = keysObservable.pipe(partition(key => valueMap.has(key))); 然后我检索这两个值并将它们输出到相同的主题: keysLocal.pipe(map(key => valueMap.get(key))) .subscribe(valu
可观察的
,它会发出钥匙。键的某些值在本地可用,有些值需要从后端检索。我将可观测数据拆分为:
const [keysLocal, keysServer]
= keysObservable.pipe(partition(key => valueMap.has(key)));
然后我检索这两个值并将它们输出到相同的主题
:
keysLocal.pipe(map(key => valueMap.get(key)))
.subscribe(value => valuesSubject.next(value));
keysServer.pipe(switchMap(key => server.slowRequest(key)))
.subscribe(value => valuesSubject.next(value));
这在大多数情况下都适用。但是,当keysObservable
连续快速发出keyServer_524
和keyLocal_314
时,将在valueServer_524
之前检索并输出valueLocal_314
。这会导致从valuesObject
输出的值与从keysObservable
输出的键的顺序不同
确保值不会按顺序发出的最惯用方法是什么?因为对于我的用例,我只关心最新的值,所以可以删除以前的请求(
valueServer_524
。问题是在分区之后,键的顺序丢失了。无法重建可观测源的顺序。因此,我决定采用一种解决方案,使用switchMap
获取最新的值,而无需对可观察对象进行分区
getValueObservable(key) {
if (valueMap.has(key)) {
return of(valueMap.get(key));
} else {
return server.slowRequest(key);
}
}
keysObservable.pipe(switchMap(getValueObservable))
.subscribe(value => valuesSubject.next(value));
我认为这是由于订阅的创建顺序造成的
我想说一个快速解决方法是在keysLocal
上使用observeOn(asyncScheduler)
操作符,这样它将在keyserver
之后输出:
keysLocal.pipe(observeOn(asyncScheduler),map(key=>valueMap.get(key)))
.subscribe(value=>valuessobject.next(value));
keyserver.pipe(开关映射(key=>server.slowRequest(key)))
.subscribe(value=>valuessobject.next(value));