将数据添加到Observable

时间:2016-03-27 08:40:11

标签: rxjs rxjs5

我有三个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

括号表示空。 有没有办法做到这一点?或者我必须完全改变它吗?

1 个答案:

答案 0 :(得分:0)

如果您需要将所有3个流合并为1,那么

combineLatest会有所帮助。如果您需要3个输出流,请使用withLatestFromsamplewithLatestFrom允许您编写一个结合了源的选择器函数,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,但过滤重复值并用空元素替换它们。为此,我们使用一个小技巧来比较最后两个元素,如果它们相等,我们插入一个空值。