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));