将可观察流中的最新值与先前值结合起来
本文关键字:结合 起来 最新 观察 | 更新日期: 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
代替CombineLatest
。Zip
仅在每一方产生下一个值后触发。
最后,反转语义。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});