我是反应性扩展的新手,所以请原谅我的无知。我有两个可观察对象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
的项目所在的相同位置(时间)。
我们应该在特定obj2
项目时间内复制obj1
项目的选择取决于哪个obj2
项目在特定obj1
项目时间内更接近。“ p>
您能否提出一种方法(可能的功能或功能管道)来实现这一目标?
感谢。
答案 0 :(得分:1)
编辑我刚注意到您要发出之前未被其他任何可观察对象发出的项目。这是无法实现的,因为它需要预见未来。
如果obj2
定期发出可预测的项目,那么您可以做一些事情。让obj2
提前半周发出这些项目,这样您就可以使用obj2
中的最新项目,而无需预测将来的项目。
以下示例将以obj2
的发射时间从obj1
发出最新项目。最简单的方法是使用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
可以使用,但它对我来说不适用于过采样。
答案 1 :(得分:1)
可观察流中的每个值都有两个元素:它出现的时间和值。所以让我们稍微改变你的原理图:
Timeline 0--1--2--3--4--5--6--7--8...
XObserve x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve y0-------y1-------y2------...
所以我们有两个observable,一个每秒发出一个值(为简单起见,我们说时间轴是第二个刻度),另一个每三秒发出一个值。鉴于这一点,您是否希望第三个流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-??...
正如您所见,ZObserve
T8
的值为??
,因为我不知道它是什么。我也不知道在T2
和T5
我怎么能预测到Y流的下一个值是什么。如果有可靠的规则,那么我们可以相应地对其进行编码,生成新的流PredictedY
,并使用WithLatestFrom
作为@Tamas建议生成Z流。
答案 2 :(得分:0)
我建议使用Operator CombineLatest,然后使用Sample