我正在通过网络学习Rx框架的材料,发现有很多。
现在每当我在谷歌上搜索时,也会找到“响应式编程”维基百科链接。
因为响应式编程是关于a := b + c的(只要b或c更改,a就会更改), 而Rx是关于订阅源发布的可观察序列。
有人能解释一下响应式编程和Rx之间的联系吗?
我正在通过网络学习Rx框架的材料,发现有很多。
现在每当我在谷歌上搜索时,也会找到“响应式编程”维基百科链接。
因为响应式编程是关于a := b + c的(只要b或c更改,a就会更改), 而Rx是关于订阅源发布的可观察序列。
有人能解释一下响应式编程和Rx之间的联系吗?
“响应式”和“交互式”程序之间的区别在于,响应式程序只会在接收到输入时执行。考虑一个非常基本的“交互式”程序——编译器。它接受文件列表,转换数据,输出结果,然后就完成了。Fin.
响应式程序并没有真正的“完成”——考虑操作系统。它何时才算“完成”?它会一直运行下去,响应来自外部世界(网络、输入设备等)的输入。或者考虑“记事本.exe”。它总是有更多的工作要做,直到用户选择“退出”菜单项。因此,你所写的每个GUI应用程序都是一个响应式程序——它基于通常没有离散终止的事件。
函数式响应式编程最重要的一个方面是,事件是一等公民。这意味着,你可以创建一个事件并将其分配给变量。在Rx中,这个变量的类型是IObservable<T>
。因为事件只是变量,我们可以将它们组合在一起,以构建更有趣的事件。
我们可以进一步将这些事件组合在一起,使用它们来构建甚至更有趣的事件,或者我们可以构建操作符,封装诸如“超时”或“重试”之类的行为,而不必将自己与源的事件类型绑定在一起。
响应式扩展是一种使用传统非纯函数语言(如C#)实现函数响应编程的方式之一。但是在使用Rx时,您可以以任何风格进行编程,但需要有纯函数响应式编程风格的纪律(有时还需要无知)才能实现。
为了使用Rx实现FRP,我们必须利用提供的类型和高级函数...
var a = new BehaviorSubject<int>(10);
var b = new BehaviorSubject<int>(5);
var c = Rx.Observable.CombineLatest(a, b, (a, c) => a + b);
behavior a = 5;
behavior b = 10;
behavior c = a + b;
Rx不是一种一阶语言。它存在于语言内部。因此,它无法对您编码的方式施加限制。它只是帮助您实现FRP的工具,因此您必须先了解FRP才能使用Rx实现它。
话虽如此,您可以使用Rx提供的可组合性,而无需以纯函数响应式风格进行编程,这通常是许多人出于方便而采用的方式。
a = b + c
。这是一个瞬时计算,其中a
仅基于b
和c
的当前值被赋值一个值。b
和c
的值发生变化时更改a
的值。因此,我们不再考虑瞬时计算,而是观察一系列随时间变化的b
和c
的值,并产生一系列随时间变化的a
的值。IObservable<T>
。IObervable<int>
的bs
和cs
序列开始,我们可以生成一系列@as
,如下所示:var @as = bs.CombineLatest(cs, (b, c) => b + c);
@as
中获取最新的值:@as.Subscribe(a =>
{
/* do something with a */
});
这是使用Rx进行响应式编程的(示例)。
响应式编程是一个古老的术语,它只是另一种说“数据流编程”的方式。这是一种编程风格,其中数据控制执行,而不是流控制(在所有常见的编程语言中使用,如C#),其中开发人员使用“if”或“for”结构明确地定义执行流。
响应式编程并不总是指函数响应式编程(FRP)。据我所知,FRP是由Conal Elliott创造的术语。
响应式扩展是数据流的一种实现方式,它允许程序使用LINQ运算符而不是使用回调来对事件流做出反应。