很长一段时间以来,我一直试图绕着RX。并且,确实如此,我不确定我是否得到它 - 或者不是。
今天,我在http://reactive-extensions.github.com/RxJS/找到了一个解释 - 在我看来 - 这太可怕了。它说:
RxJS是承诺异步的事件。
大。这句话非常复杂,如果你对RX的含义一无所知,在那句话之后,你就像以前一样愚蠢。
这基本上是我的问题:你发现的关于RX的常见地方的所有解释(至少我)都感到愚蠢。他们将RX解释为一个高度复杂的概念,其中包含 lot 高度复杂的单词和术语,而且我无法确定它是什么。
所以我的问题是:你怎么解释RX给五岁的人?我想要一个清晰,风景如画的解释,它是什么,它有什么好处,它的主要概念是什么?
答案 0 :(得分:36)
所以,LINQ(在JavaScript中,这些是高级数组方法,如map
,filter
,reduce
等 - 如果你不是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
正在对这些号码执行某些操作。
让我们说producer
正在生成一个素数列表。通常你会有一些函数产生一个数字列表,每次返回时它会将它通过管道计算的下一个值推送到consumer
,这会将该数字输出到屏幕。
Prime Generator ---> Console.WriteLine
在这种情况下,很容易看到producer
正在完成大部分工作,而consumer
会等待producer
发送下一个值。 consumer
在管道上拉,等待producer
返回下一个值。
好的,假设您有一个处理1,000,000个项目的功能。每个项目都需要几毫秒的时间来处理,然后该函数会产生一个百分比值,表示它已经达到了多远。所以有很多进步值,非常快。
在管道的另一端,您有一个进度条。现在,如果进度条要处理每个更新,UI将阻止尝试跟上值流。
1百万件物品处理器--->进度条
在这种情况下,数据被producer
推送通过管道,然后consumer
被阻止,因为推送的数据太多让它处理。
Reactive允许您输入延迟,窗口或对管道进行采样,具体取决于您希望consume
数据的方式。在这种情况下,我会在更新进度条之前每秒对数据进行一次采样。
所以列表和事件有点相同。不同之处在于数据是通过系统拉还是推送。使用列表,数据被拉。对于事件,数据被推送。