将可观察流中的最新值与先前值结合起来

本文关键字:结合 起来 最新 观察 | 更新日期: 2023-09-27 18:13:16

我试图弄清楚如何采取T的可观察序列,并在我的订阅者中获得T的最新和以前的值。以下是我的峰值代码:

static void Main(string[] args)
{
    var latest = new Subject<string>();
    var previous = latest.SkipLast(1);
    var latestWithPrevious = latest.CombineLatest(previous, (l, p) => new { Latest = l, Previous = p });
    latestWithPrevious.Subscribe(x => Console.WriteLine("Latest: {0} Previous: {1}", x.Latest, x.Previous));
    latest.OnNext("1");
    latest.OnNext("2");
    latest.OnNext("3");
    Console.ReadKey();
}

我想要下面的输出:

Publishing 1
Publishing 2
Latest: 2 Previous: 1
Publishing 3
Latest: 3 Previous: 2

然而,我得到了以下内容:

Publishing 1
Publishing 2
Latest: 2 Previous: 1
Publishing 3
Latest: 3 Previous: 1
Latest: 3 Previous: 2

因此,向latest发布"3"触发了latestWithPrevious中的两个刻度:第一个是Previous的旧值,第二个是Previous的正确值。

我怎样才能达到我的目标?

将可观察流中的最新值与先前值结合起来

使用Skip(1),而不是SkipLast(1)SkipLast跳过流中的最后N个条目。

另外,CombineLatest在改变时仍然会触发每一边的事件,所以你会得到比你想要的更多的事件。使用Zip代替CombineLatestZip仅在每一方产生下一个值后触发。

最后,反转语义。latest为跳过第一个值的序列,previous为包含第一个值的序列。

var source = new Subject<string>();
var previous = source;
var latest = source.Skip(1);
var latestWithPrevious = latest.Zip(previous, (l, p) => new { Latest = l, Previous = p});