以来,我一直在尝试围绕RX。而且,说实话,我永远不确定我是否得到了它。
今天,我找到了关于 http://reactive-extensions.github.com/RxJS/的解释,在我看来,这很可怕。它说:
RxJS之于事件,就像承诺之于异步一样。
伟大。这是一个充满复杂性的句子,如果你对RX是什么一无所知,在那句话之后你和以前一样愚蠢。
这基本上是我的问题:你在通常的地方找到的关于RX的所有解释都让(至少我(感到愚蠢。他们将RX解释为一个高度复杂的概念,其中包含许多高度复杂的单词和术语等等,我从来都不太确定它是关于什么的。
所以我的问题是:你会如何向一个五岁的人解释RX?我想要一个清晰、风景如画的解释,它是什么,它有什么好处,它的主要概念是什么?
在JavaScript中,这些是高级数组方法,如map
,filter
,reduce
等 - 如果你不是C#开发人员,只要我提到"LINQ"就替换它(给你一堆工具,你可以应用于序列(粗略意义上的"列表"(,以便过滤输入并将其转换为输出(又名"对我来说实际上感兴趣的列表"(。但什么是列表?
什么是列表?
列表是按特定顺序排列的一些元素。我可以采用任何列表,并使用 LINQ 将其转换为更好的列表。
(不一定是排序顺序,而是一个顺序(。
事件是一个列表
但是活动呢?让我们订阅一个事件:
OnKeyUp += (o,e) => Console.WriteLine(e.Key)
>>> 'H'
>>> 'e'
>>> 'l'
>>> 'l'
>>> 'o'
嗯。这看起来像一些东西,按特定顺序排列。现在你突然意识到,列表和事件是一回事!
如果列表和事件相同....
。那为什么我不能将输入事件转换和过滤为更有趣的事件。这就是Rx。它获取有关处理序列的所有知识,包括所有 LINQ 运算符(如 Select 和 Where 和 Aggregate(,并将它们应用于事件。
简单易行。
回调也是一个序列
回调基本上不就是一个只发生一次的事件吗?它基本上不是就像一个带有一个项目的列表吗?事实证明,关于 Rx 的一个有趣的事情是,它允许我们使用相同的语言处理事件和回调(以及地理位置请求之类的东西((即我们可以将两者结合起来,或者等待以太币一个或另一个,等等(。
除了保罗的出色回答外,我还想添加拉取与推送数据的概念。
管道
让我们以一些代码为例,这些代码生成一系列数字并输出结果。如果你把它想象成一个流,一端你有一个为你创建新数字的producer
,而在另一端,你有一个consumer
正在用这些数字做一些事情。
拉动 - 素数列表
假设producer
正在生成一个质数列表。通常你会有一些函数来产生一个数字列表,每次它返回时,它都会通过管道将它计算的下一个值推送到consumer
,这会将该数字输出到屏幕上。
主生成器 ---> 控制台.写线
在这种情况下,很容易看出producer
正在执行大部分工作,而consumer
将坐在那里等待producer
发送下一个值。consumer
正在拉动管道,等待producer
返回下一个值。
推送 - 来自快速进程的进度百分比事件(反应式(
好的,假设您有一个处理 1,000,000 个项目的函数。每个项目都需要几毫秒来处理,然后函数会生成它所走多远的百分比值。所以很多进度值,非常快。
在管道的另一端,您有一个进度条。现在,如果进度条要处理每次更新,则 UI 将阻止尝试跟上值流。
100 万个项目处理器--->进度条
在此方案中,数据由producer
通过管道推送,然后consumer
阻塞,因为推送的数据过多,无法处理。
响应式允许您根据您希望如何consume
数据来放置延迟、窗口或对管道进行采样。在这种情况下,我会在更新进度条之前每秒对数据进行采样。
列表与事件
所以列表和事件有点相同。区别在于数据是通过系统拉取还是推送。使用列表提取数据。通过事件推送数据。