CombineLatest 反应运算符如何工作?
How does CombineLatest reactive operator work?
我在 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
我无法解释这个序列的开头:
- 为什么第一个计算值是
2 0
?
- 为什么开始10秒后输出
2 0
?
发件人: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();
在每一方至少有一条消息之前,CombineLatest 不会发出任何消息。这发生在你的情况开始后 10 秒,当你从 10 秒可观察到的第一条消息时: 来自 3 秒可观察到的三条消息已经发出,所以第三条被发出,与第一条消息配对10秒一个。
我在 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
我无法解释这个序列的开头:
- 为什么第一个计算值是
2 0
? - 为什么开始10秒后输出
2 0
?
发件人: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();
在每一方至少有一条消息之前,CombineLatest 不会发出任何消息。这发生在你的情况开始后 10 秒,当你从 10 秒可观察到的第一条消息时: 来自 3 秒可观察到的三条消息已经发出,所以第三条被发出,与第一条消息配对10秒一个。