有条件地组合两个时移观测值
Combining two time-shifted observables conditionally
我需要组合两个通常一个接一个产生值的观察值。第一个序列(我们称之为 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
那么我认为这会成功:
// 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---------
我需要组合两个通常一个接一个产生值的观察值。第一个序列(我们称之为 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
那么我认为这会成功:
// 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---------