我想创建一个可观察量,当右侧可观察量发出一个值并获取最后一个左侧可观察值时,即发出一个可观察量,即,如下面的弹珠图所示(取自combining-sequences)
阅读上述链接中的文档表明,这可以通过确保不相交的左持续时间选择器和立即返回的右持续时间选择器来实现。所以我尝试了这个:
leftObservable.Join(rightObservable, _ => leftObservable.Publish().RefCount(), _ => Observable.Empty<Unit>(), (l,r) => (l,r))
但这似乎没有发出任何东西。我做错了什么?
更新
我认为这可能取决于被输入到 Join 语句中的可观察量,即它们源自
switch
,例如,
var left1 = Observable.Interval(TimeSpan.FromSeconds(5));
var left2 = Observable.Interval(TimeSpan.FromSeconds(7));
var left = left1.Select(x => left2).Switch();
var right = Observable.Interval(TimeSpan.FromSeconds(1));
var test = left.Join(right, _ => left.Publish().RefCount(), _ => Observable.Empty<Unit>(), (l, r) => (l, r))
.Distinct(x => x.r)
.Subscribe(x =>
{
Debug.WriteLine($"left: {x.l}, right: {x.r}");
});
如果我在
left
语句中将 left
替换为 join
,事情就会按预期进行。所以我一定是误解了 switch
在这种情况下是如何工作的?
static async Task Main()
{
var left = Observable.Interval(TimeSpan.FromSeconds(0.3));
var right = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
right.WithLatestFrom(left).Subscribe(i => Console.WriteLine(i));
Console.ReadLine();
}
给出输出:
(2, 8)
(3, 12)
(4, 15)
(5, 18)
(6, 22)
(7, 25)
(8, 29)
看起来你在期待什么?