RxJS-初始状态和更新

时间:2019-11-13 14:14:12

标签: javascript node.js typescript rxjs reactive-programming

我需要从websocket获取数据,并且我想使用RxJS这样做。

有一个 websocket 1 用于最新的初始数据(约1000条记录),和 websocket 2 用于增量更新。

我创建了两个观察值:

  • initalState$转到 websocket 1 ,并获取初始数据,然后完成。
  • updateEvent$进入 websocket 2 并持续接收更新。

我最初的实现是:

initialState.subscribe(initialData=> {
    console.log(initialData);
    updateEvent.subscribe(updateEvent => {
        console.log(updateEvent);
    });
});

我面临的问题是,在获取 initalState 并收到第一个更新( updateEvent )之后,还有一段空白。

(在获取初始数据之后和订阅之前,我可能会丢失更新)。

是否有一些实用的方法可以创建一个新的Observer来同时订阅两个观察者,并缓冲 updateEvent 观察者,直到 initalState 完成并然后以正确的顺序将它们“先初始化数据”再“更新”?

基本上使initialState只是“第一个”更新,但要确保此后没有丢失的更新。

2 个答案:

答案 0 :(得分:1)

您似乎可以通过对第二个websocket流使用buffer来实现所需的功能,直到第一个websocket流发出为止。虽然,此链变得有些复杂,因为您只想在第一个流发出后才开始接收值。

const initialStateShared = initialState.pipe(share());
const updateEventShared = updateEvent.pipe(share());

merge(
  initialStateShared,
  updateEventShared.pipe( // Buffer the second stream but only once
    buffer(initialStateShared),
    take(1),
  ),
  updateEventShared.pipe( // Updates from the second stream will be buffered first and then continue comming from here
    skipUntil(initialStateShared),
  )
).subscribe(...);

答案 1 :(得分:0)

如果我理解正确,那么您想要的是同时触发两个请求并仅在两个请求均可用时对其进行订阅。我认为您正在寻找combineLatest运算符。

combineLatest([initialState$, updateEvent$]).subscribe(([initialState, updateEvent] => {
    console.log({initialState, updateEvent});
}));

这样,组合的可观察对象将等待initialState $和updateEvent $都发出了某种东西,此后,如果任何一个组合的可观察对象发出了某种东西,它将触发发出。有关更多信息,请参见https://www.learnrxjs.io/operators/combination/combinelatest.html

注意:您应避免在另一个订阅中进行订阅。经常因做错事而有代码味。