我有三个Observable包含来自服务器的获取数据(所有相同类型)。为了很好地显示数据,我想将空数据点添加到流中,以便时间对齐(记录数据的时间)。像这样:
Stream 1: 12:30 ------ 15:30 -- 16:00 ----------------- 19:00
Stream 2: 12:30 --------------- 16:00 ------ 17:30 ----------
Stream 3: -------------15:30 -------------------------- 19:00
| |
V V
Stream 1: 12:30 ------ 15:30 -- 16:00 ------(17:30)---- 19:00
Stream 2: 12:30 ------(15:30)-- 16:00 ------ 17:30 ----(19:00)
Stream 3:(12:30)-------15:30 --(16:00)------(17:30)---- 19:00
括号表示空。 有没有办法做到这一点?或者我必须完全改变它吗?
答案 0 :(得分:0)
combineLatest
会有所帮助。如果您需要3个输出流,请使用withLatestFrom
或sample
。 withLatestFrom
允许您编写一个结合了源的选择器函数,sample
直接输出原始值。请注意,与样本相比,您必须反转withLatestFrom
上的参数。
当2个源以非常接近的连续发射时,您可能还希望新流仅发出1个值。我们可以使用debounce
执行此操作。
combineLatest
的代码非常简单:
Rx.Observable.combineLatest(source1, source2, source3, (s1, s2, s3) => ...)
.debounce(10)
结果:
Stream 1: 12:30 ------ 15:30 -- 16:00 ----------------- 19:00
Stream 2: 12:30 --------------- 16:00 ------ 17:30 ----------
Stream 3: -------------15:30 -------------------------- 19:00
| |
V V
Stream: 12:30 ------ 15:30 -- 16:00 -------17:30----- 19:00
如果我们想要3个流,我们使用withLatestFrom
:
var streams = Rx.Observable.merge(source1, source2, source3);
s1 = source1.sample(sources).debounce(10);
s2 = source2.sample(sources).debounce(10);
s3 = stream3.sample(sources).debounce(10);
或者如果我们使用withLatestFrom
:
s1 = streams.withLatestFrom(source1).debounce(10);
结果:
Stream 1: 12:30 ------ 15:30 -- 16:00 ----------------- 19:00
Stream 2: 12:30 --------------- 16:00 ------ 17:30 ----------
Stream 3: -------------15:30 -------------------------- 19:00
| |
V V
Stream 1: 12:30 ------ 15:30 -- 16:00 ------ 16:00 ---- 19:00
Stream 2: 12:30 -------12:30 -- 16:00 ------ 17:30 ---- 17:30
Stream 3: -------------15:30 -- 15:30 ------ 15:30 ---- 19:00
我不是100%肯定你的意思是“括号意味着空”。你想要这样的大理石吗?
Stream 1: a ---- b ------------ c --------- d ---------
Stream 2: g ---- i -----k------ l --------- m ---------
Stream 3: h ---- j ------------ i ----u---- a ---------
| |
V V
Stream 1: a ---- b -----_------ c ----_---- d ---------
Stream 2: g ---- i -----k------ l ----_---- m ---------
Stream 3: h ---- j -----_------ i ----u---- a ---------
_
是一个空元素?
source1.sample(Rx.Observable.merge(source1, source2, source3))
.debounce(10)
.startWith("_")
.publish(xs => xs.zip(xs.skip(1)), (a, b) => a === b ? "_", b)
然后我们可以使用sample
,但过滤重复值并用空元素替换它们。为此,我们使用一个小技巧来比较最后两个元素,如果它们相等,我们插入一个空值。