要求对Reactive Extensions(RX)进行清晰,风景如画的解释?

Gol*_*den 14 system.reactive reactive-extensions-js

很长一段时间,我现在试图绕着RX包裹.而且,说实话,我不确定我是否得到它 - 或者不是.

今天,我在http://reactive-extensions.github.com/RxJS/上找到了一个解释- 在我看来 - 这太可怕了.它说:

RxJS是承诺异步的事件.

大.这是一个如此复杂的句子,如果你对RX的含义一无所知,在那句话之后,你就像以前一样愚蠢.

这基本上是我的问题:你发现的关于RX的常见地方的所有解释(至少我)都感到愚蠢.他们将RX解释为一个高度复杂的概念,包含许多高度复杂的单词和术语,我不知道它是什么.

所以我的问题是:你怎么解释RX给五岁的人?我想要一个清晰,风景如画的解释,它是什么,它有什么好处,它的主要概念是什么?

Ana*_*tts 36

所以,LINQ(在JavaScript中,这些都是高层次的阵列的方法,如map,filter,reduce,等-如果你不是一个C#开发,只需更换,每当我提到"LINQ")给你一堆,你可以应用到的工具序列(粗略意义上的"列表"),用于过滤输入并将输入转换为输出(也就是"我真正感兴趣的列表").但什么是清单?

什么是清单?

List,是特定顺序中的一些元素.我可以使用任何列表并使用LINQ 将其转换为更好的列表.

(不一定是排序顺序,而是订单).

事件是一个列表

但是一个活动怎么样?我们订阅一个活动:

OnKeyUp += (o,e) => Console.WriteLine(e.Key)
>>> 'H'
>>> 'e'
>>> 'l'
>>> 'l'
>>> 'o'
Run Code Online (Sandbox Code Playgroud)

嗯.这看起来像某些事情,按照特定的顺序.它现在突然恍然大悟,列表和事件是一回事!

如果列表和事件是相同的....

...那么为什么我不能将输入事件转换和过滤成更有趣的事件.这就是Rx.它将您处理序列的所有知识都包括在内,包括所有LINQ运算符(如Select和Where和Aggregate),并将它们应用于事件.

十分简单.

回调也是一个序列

回调基本上只是一次只发生一次的事件吗?它基本上就像一个带有一个项目的List吗?事实证明它是,并且关于Rx的一个有趣的事情是它允许我们用相同的语言处理事件和回调(以及地理定位请求之类的东西)(即我们可以将两者结合起来,或者等待以太网中的一个,等等).


Cam*_*and 16

除了保罗的优秀答案,我还想添加拉动与推送数据的概念.

管道

让我们以一些生成一系列数字的代码为例,并输出结果.如果你认为这是一端的流你有一个producer为你创建新数字,另一方面你有一个consumer正在做这些数字的事情.

Pull - Primes List

让我们说producer生成一个素数列表.通常你会有一些函数产生一个数字列表,每次返回时它会将它通过管道计算的下一个值推送到consumer,这会将该数字输出到屏幕.

Prime Generator ---> Console.WriteLine

在这种情况下,很容易看到它producer正在完成大部分工作,并且consumer会坐在那里等待producer发送下一个值.该consumer拉动对管道,等待producer返回的下一个值.

推送 - 快速流程中的进度百分比事件(反应性)

好的,假设您有一个处理1,000,000个项目的功能.每个项目都需要几毫秒的时间来处理,然后该函数会产生一个百分比值,表示它已经达到了多远.所以很多进步值,非常快.

在管道的另一端,您有一个进度条.现在,如果进度条是处理每个更新,UI将阻止尝试跟上值流.

1百万项处理器--->进度条

在这种情况下,数据被通过管道推送producer,然后consumer阻塞,因为推送的数据太多而无法处理.

Reactive允许您根据您对数据的期望输入延迟,窗口或对管道进行采样consume.在这种情况下,我会在更新进度条之前每秒对数据进行采样.

列表与事件

所以列表和事件有点相同.不同之处在于是通过系统拉取还是推送数据.使用列表可以提取数据.通过事件,数据被推送.