Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS-初始状态和更新_Javascript_Node.js_Typescript_Rxjs_Reactive Programming - Fatal编程技术网

Javascript RxJS-初始状态和更新

Javascript RxJS-初始状态和更新,javascript,node.js,typescript,rxjs,reactive-programming,Javascript,Node.js,Typescript,Rxjs,Reactive Programming,我需要从websocket获取数据,我想使用RxJS来实现这一点 最新的初始数据(~1000条记录)有websocket 1,增量更新有websocket 2 我创建了两个可观察对象: initalState$转到websocket 1并获取初始数据,然后完成 updateEvent$转到websocket 2并持续接收更新 我最初的实施是: initialState.subscribe(initialData=>{ console.log(initialData); 订阅(updateEv

我需要从websocket获取数据,我想使用RxJS来实现这一点

最新的初始数据(~1000条记录)有websocket 1,增量更新有websocket 2

我创建了两个可观察对象:

  • initalState$
    转到websocket 1并获取初始数据,然后完成
  • updateEvent$
    转到websocket 2并持续接收更新
我最初的实施是:

initialState.subscribe(initialData=>{
console.log(initialData);
订阅(updateEvent=>{
console.log(updateEvent);
});
});
我面临的问题是,在获取initalState并接收第一次更新(updateEvent)之后,出现了一个间隙

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

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


基本上,使initialState只是“第一次”更新,但要确保之后没有任何缺少的更新

如果我理解正确,您想要的是同时触发这两个请求,并且仅当两个请求都可用时才订阅它们。我想您正在寻找
combinelateest
操作符

combineLatest([initialState$, updateEvent$]).subscribe(([initialState, updateEvent] => {
    console.log({initialState, updateEvent});
}));
这样,组合的可观察对象将等待initialState$和updateEvent$都发出了什么,然后如果组合的可观察对象中的任何一个发出了什么,它将触发emits。有关更多信息,请参阅


注意:您应该防止在另一个订阅中执行订阅。这通常是一种做错事的代码味道。

看起来您可以通过对第二个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(...);

在rxjs中嵌套订阅几乎总是表示API使用不佳,有时甚至是实际错误。如果不想丢失任何事件,请检查缓冲区操作符,
merge
。但这似乎不是你所需要的全部。谢谢你的回答!我正在研究CombineTest,但是如果我同时启动initialState$和updateEvent$,然后在第一个initialState完成之前收到10个更新事件,那么除了最后一个更新事件之外,我将丢失所有更新事件。您如何缓冲updateEvent?您会合并这些更新,还是需要在加载initialState之前所有已发生的更新?还有相同类型的initialState$和updateEvent$可观测对象吗?谢谢,这个解决方案太棒了!