我正在处理来自GDAX的websocket的数据,这些数据实时发出交易状态(来源B)。为了构建完整的订单簿,我需要通过API调用(源A)获取本书的当前快照。
首先我处理包含序列号的源A,而我正在处理它,我正在从源B排队事件。一旦处理源A我发出“SYNCED”状态,当收到SYNCED时我释放所有排队来自B的事件作为数组并丢弃来自源A的序列号之前的任何事件,然后处理它们。在释放排队事件时,应该实时处理来自B的任何传入事件。
源B可以在任何时候丢弃一个事件,当发生这种情况时,我将状态重置为空白,调用源A并重复该过程。
现在,我正在尝试在RXJS中使用缓冲区,但它只是在发出SYNCED之前释放事件,然后开始缓冲B直到再次调用该事件。这是不同的,因为我只想在同步进行过程中排队事件,然后一旦完成,我想处理背压事件,然后在事件进入时处理事件。我不确定如何在可观察的条款......到目前为止我的内容是:
Observable
.fromEvent(this.ws$, 'message')
.map((m: any) => m.data)
.map((s: string) => JSON.parse(s))
.buffer(process$)
.flatMap(_ => _)
.filter((message: any) => message.sequence > this.sequence)
.subscribe((message: any) => {
if (message.sequence !== this.sequence + 1) {
throw new Error("Out of sync");
}
this.sequence = message.sequence;
this.emit('message', message);
}, (err: any) => {
throw new Error(err);
});