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