我是响应式扩展的新手,所以请原谅我的无知。我有两个可观察对象obj1
和obj2
,它们返回项。在一个特定的时间窗口T(我想是缓冲区)中,我想对最稀疏的项目序列进行上采样。请看,一个示意图示例。
Time of returned objects
obj1 t1 t2 t3 t4 t5 t6 ...
obj2 t1 t2 t3 ...
os_obj2 t1 t1 t2 t2 t2 t3 ...
time_window <-----T-----><-----T----->
在上采样过程中,我们将obj2
的返回项放置在obj1
的返回项存在的相同位置(时间)。
在特定的obj1
项目时间上复制哪个obj2
项目取决于哪个obj2
项目更接近特定的obj1
项目时间。
你能建议一种方法(可能的函数,或函数的管道)来实现吗?
谢谢。
EDIT我刚刚注意到您想要发出以前任何其他可观察对象都没有发出的项。这是不可能实现的,因为它需要预见未来。
如果obj2
定期发出可预测的项,那么您可以做一些事情。让obj2
提前半个周期发出这些项目,这样你就可以只使用obj2
的最新项目,而不需要预测未来的项目。
下面的示例将在obj1
的发射时间发射obj2
的最新项。最简单的是使用Observable.withLatestFrom
。
var obj1 = Rx.Observable.interval(500).map(x => "obj1." + x).take(10);
var obj2 = Rx.Observable.interval(300).map(x => "obj2." + x).take(10);
obj2.withLatestFrom(obj1).pluck(1).subscribe(x => console.log(x));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-beta.11/Rx.umd.js"></script>
PS:起初我认为sample
可以使用,但它不适合我的过采样。
可观察流中的每个值都有两个元素:它出现的时间和值。让我们稍微修改一下示意图:
Timeline 0--1--2--3--4--5--6--7--8...
XObserve x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve y0-------y1-------y2------...
所以我们有两个可观察对象,一个每秒发出一个值(为简单起见,我们设时间轴是秒刻度),另一个每三秒发出一个值。考虑到所有这些,您是否希望第三个流ZObserve
使用上采样技术以X流的速率为Y流生成值,就像这样?
Timeline 0--1--2--3--4--5--6--7--8-...
XObserve x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve y0-------y1-------y2------...
ZObserve y0-y0-y1-y1-y1-y2-y2-y2-??...
你可以看到T8
的ZObserve
的值是??
,因为我不知道它是什么。我也不知道在T2
和T5
我怎么能预测Y流的下一个值是什么。如果它们是什么有可靠的规则,那么我们可以相应地编码,生成一个新的流PredictedY
,并使用WithLatestFrom
作为@Tamas建议的生成Z流。
我建议使用Operator combinellatest并可能在之后使用Sample