CombineLatest反应式运算符如何工作?

时间:2019-01-22 04:47:23

标签: system.reactive

我已经在Linqpad中运行了以下代码段:

$"[{(DateTime.Now.ToString("HH:mm:ss.fff"))}] 0 0".Dump();
Observable
    .Interval(TimeSpan.FromSeconds(3))
    .CombineLatest(Observable.Interval(TimeSpan.FromSeconds(10)), (x, y) => $"[{(DateTime.Now.ToString("HH:mm:ss.fff"))}] {x} {y}")
    .Do(Console.WriteLine).Wait();

这是我得到的结果:

[23:38:40.111] 0 0
[23:38:50.183] 2 0
[23:38:52.180] 3 0
[23:38:55.196] 4 0
[23:38:58.197] 5 0
[23:39:00.181] 5 1
[23:39:01.198] 6 1
[23:39:04.198] 7 1
[23:39:07.210] 8 1
[23:39:10.196] 8 2
[23:39:10.211] 9 2
[23:39:13.211] 10 2
[23:39:16.211] 11 2
[23:39:19.212] 12 2
[23:39:20.197] 12 3
[23:39:22.227] 13 3
[23:39:25.228] 14 3
[23:39:28.229] 15 3
[23:39:30.196] 15 4
[23:39:31.241] 16 4
[23:39:34.242] 17 4

我无法解释此序列的开始:

  1. 为什么第一个计算值2 0
  2. 为什么在开始10秒后输出2 0

2 个答案:

答案 0 :(得分:1)

发件人:http://reactivex.io/documentation/operators/combinelatest.html

最新组合

当两个Observable之一发射一个项目时,通过指定的函数合并每个Observable发射的最新项目,并根据此函数的结果发射项目

也许此修改后的代码将帮助您了解正在发生的事情:

$"[{(DateTime.Now.ToString("HH:mm:ss.fff"))}] 0 0".Dump();
Observable.Interval(TimeSpan.FromSeconds(3))
        .Do(x => $"[{(DateTime.Now.ToString("HH:mm:ss.fff"))}] {x} _".Dump())
    .CombineLatest(
        Observable.Interval(TimeSpan.FromSeconds(10))
            .Do(y => $"[{(DateTime.Now.ToString("HH:mm:ss.fff"))}] _ {y}".Dump()),
        (x, y) => $"[{(DateTime.Now.ToString("HH:mm:ss.fff"))}] {x} {y}")
    .Do(s => s.Dump())
    .Wait();

答案 1 :(得分:0)

除非双方至少有一条消息,否则CombineLatest不会发出任何消息。在您的情况下,这种情况发生在您启动10秒钟后,当您从10秒可观察到的消息中得到第一条消息时:3秒可观察到的消息中有3条消息出来了,因此发出了第三条消息,与10秒一秒。