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

时间:2013-02-22 21:52:58

标签: system.reactive reactive-extensions-js

很长一段时间以来,我一直试图绕着RX。并且,确实如此,我不确定我是否得到它 - 或者不是。

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

  

RxJS是承诺异步的事件。

大。这句话非常复杂,如果你对RX的含义一无所知,在那句话之后,你就像以前一样愚蠢。

这基本上是我的问题:你发现的关于RX的常见地方的所有解释(至少我)都感到愚蠢。他们将RX解释为一个高度复杂的概念,其中包含 lot 高度复杂的单词和术语,而且我无法确定它是什么。

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

2 个答案:

答案 0 :(得分:36)

所以,LINQ(在JavaScript中,这些是高级数组方法,如mapfilterreduce等 - 如果你不是C#dev,只需替换它无论什么时候我提到'LINQ')都会给你一堆工具,你可以将它们应用于序列(粗略意义上的“列表”),以便将输入过滤并转换为输出(又名“一个对我来说真的很有趣的列表“)。但什么是清单?

什么是清单?

列表,是一些元素,具体为订单。我可以使用任何列表并使用LINQ将其转换为更好的列表。

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

事件是列表

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

OnKeyUp += (o,e) => Console.WriteLine(e.Key)
>>> 'H'
>>> 'e'
>>> 'l'
>>> 'l'
>>> 'o'

嗯。这似乎是某些事情,以特定顺序。它现在突然恍然大悟,列表和事件是一回事!

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

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

轻松自负。

回调是一个序列

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

答案 1 :(得分: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数据的方式。在这种情况下,我会在更新进度条之前每秒对数据进行一次采样。

列表与事件

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