在深入研究响应式编程(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接收到一个条目。