【问题标题】:Combining two time-shifted observables conditionally有条件地组合两个时移的可观察量
【发布时间】:2015-04-12 15:27:56
【问题描述】:

我需要组合两个通常一个接一个产生值的可观察对象。第一个序列(我们称之为Seq A)比第二个序列(Seq B)产生更多的值,但通常来自第一个可观察对象的一堆值后面跟着第二个值。所以基本上我需要从Seq A 的最新值和Seq B 的最新值中产生一个值。

但是,第二个序列可能不会产生值。在这种情况下,组合序列仍应产生一个值;当来自SeqA 的值和一些超时Seq B 仍然没有产生值时,我需要从Seq A 产生一个值。

大理石图应该是这样的:

                          <-> Timeout          No timeout
Seq A  | a1-----------a2a3---------------a4a5-a6---------
Seq B  | --b1----------------------------------b3--------
Output | ---x1--------------x2------------------x3-------
                            ^ - I need this      ^ - And this

Output 基本上是值的某种组合。

PS:我很难简洁地解释这个问题,所以请原谅标题。

【问题讨论】:

  • 那么,用更通俗的话来说——如果序列 A 不能以足够快的速度生成一个值作为故障保护,您想从序列 B 中生成一个值吗?所以 A 获得了更高的优先级,但如果它在超时时间内没有产生值,那么选择 A 中的值?
  • @Benjamin Gruenbaum:差不多,但反过来。 B 具有优先级,A 是后备。
  • 没有足够的规范来保证解决这个问题:尚不清楚 x 依赖于 a 和 b 的哪些值;目前尚不清楚在超时期间产生后续值如何影响 x。我认为您是说来自 a 的值开始超时,在超时或 ab 元素到达时,a 的最新值和可能的 b(其中 b 可能没有值)被输入结果选择器以产生 x?在那一点上,a 的下一个值开始一个新的超时?如果有 a b 而没有 a - 会立即将 b 输入结果选择器吗?
  • 呃,我不小心删除了我的评论。那是:@JamesWorld:对不起,我应该提供更多信息。假设 B 产生一个值,这个值和 A 的最后一个值产生输出。但是如果发生超时,我仍然需要单独从 A 产生输出。该输出是使用副作用计算的,该副作用取决于 A 和 B 具有值或仅 A 的值这一事实。如果只有 B 提供,那么这个值就足够了所以本质上你的假设是正确的。
  • @JamesWorld:A 的每个值都会重置超时,直到它可以与 B 值组合或产生没有 B 的结果。它的行为应该像使用 Sample()

标签: c# system.reactive


【解决方案1】:

我会尝试一下。给定 observables AB 那么我认为这可以解决问题:

// 1500 millisecond timeout to be used on observable B.
TimeSpan timeout = TimeSpan.FromMilliseconds(1500);

var result =
    A
    .Select(a => 
        B
        .Timeout(timeout)
        .Materialize()
        .Take(1)
        .Select(b => b.Kind == NotificationKind.OnNext ? b.Value : a))
    .Switch();

这个的大理石图应该是这样的:

                                               <-1500ms->Timeout
SeqA   |--------a0--------------a1-a2--------a3---------------------
SeqB   |b0--------b1----b2-----------b3-----------------------------
Output |----------b1-----------------b3------------------a3---------

【讨论】:

  • 完美,正是我所需要的。谢谢你,先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 2019-02-25
  • 2020-09-22
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多