2

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

括号表示为空。有没有好的方法来做到这一点?还是我必须完全改变它?

4

1 回答 1

1

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

于 2016-04-03T23:18:13.817 回答