响应式编程与大理石图的探索

在深入研究响应式编程(Reactive Programming)之后,发现它非常有趣,并且可能是对异步编程结构的一种新的思考或理解方式。响应式框架(Reactive Framework)引入了一些操作符,可以将它们应用于Observable以获取结果Observable。这些属性的表示可以通过大理石图(Marble Diagrams)来完成。

在开始处理响应式框架之前,最好从IObservable和IObserver开始。已经介绍了这两个接口,它们是响应式框架的构建块。可以在阅读关于大理石图的文章之前阅读这些文章。

大理石图的创建

大理石图基本上是表示Rx操作的一种方式。可以将大理石图视为定义在响应式框架中的不同操作符的图形表示。让看看如何创建一个大理石图:

在示例图像中,可以看到在X轴上测量时间,而在Y轴上进行操作。例如,如果有一个Observable,它由第一条水平线表示。小圆圈代表IObserver的OnNext调用。如果已经知道Observable和Observer,可能已经知道每个Observer都有一个OnNext方法,每当观察者改变其状态时就会调用该方法。因此,在案例中,观察者调用一个函数f()来获取新状态。竖线“|”代表Observer的OnComplete。所以,在OnComplete之后,Observer将停止观察状态。

在大理石图中使用“X”来表示OnError。在Observable的情况下,OnError和OnComplete会产生观察者的终点。所以,在这里,在执行两个OnNext之后,如果Observer遇到一个异常,OnError被调用,Observer将终止。

创建一些大理石图

现在,将创建一些大理石图,以使理解更加清晰。

SelectMany操作符很容易解释。假设有两个或更多的Observer。在这种情况下,SelectMany将最终调用每个Observer的OnNext。

例如,如果有3个观察者,SelectMany将产生一个Observer,它聚合了所有的Observer。

var ob1 = Observable.Return(5); var ob2 = Observable.Return(4); var ob3 = ob1.SelectMany(ob2); var disp = ob3.Subscribe( r => Console.WriteLine("OnNext"), r => Console.WriteLine("Completed"), () => Console.WriteLine("Error") ); disp.Dispose();

Observer将从每个Observer中选择,并为提供输出。如果发生错误,最终的Observer将在遇到任何Observer的第一个错误时停止。

SkipWhile和SkipUntil的操作相反。例如,如果有两个Observable。SkipUntil在从另一个Observer接收到OnNext之前,为每个Observable提供OnNext。相反,SkipWhile将在从第二个Observer接收到OnNext时为Observer提供OnNext。当第二个Observer完成或出现错误时,最终的Observer将在SkipWhile的情况下终止。

在上面的图表中,可以看到While将绕过所有值,直到第二个Observer接收到一个条目。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485