【问题标题】:How does CombineLatest reactive operator work?CombineLatest 反应式操作符是如何工作的?
【发布时间】:2019-01-22 23:06:01
【问题描述】:

我在 Linqpad 中运行了以下代码 sn-p:

$"[{(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. 为什么2 0在开始10秒后输出?

【问题讨论】:

    标签: system.reactive


    【解决方案1】:

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

    合并最新

    当两个 Observable 中的任何一个发出 item 时,通过指定的函数组合每个 Observable 发出的最新 item,并根据该函数的结果发出 item

    也许这个修改后的代码会帮助你理解发生了什么:

    $"[{(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();
    

    【讨论】:

    • 现在我明白了。关键字是每个
    【解决方案2】:

    在每边至少有一条消息之前,不会从 CombineLatest 发出任何内容。这发生在您的案例开始后 10 秒,当您从 10 秒可观察对象中获得第一条消息时:来自 3 秒可观察对象的三条消息已经出来,因此发出第三条消息,与第一条消息配对10 秒。

    【讨论】:

    • 重点是在每一边。现在我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多