请求对反应式扩展 (RX) 进行清晰、美观的解释


很长一段时间

以来,我一直在尝试围绕RX。而且,说实话,我永远不确定我是否得到了它。

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

RxJS之于事件,就像承诺之于异步一样。

伟大。这是一个充满复杂性的句子,如果你对RX是什么一无所知,在那句话之后你和以前一样愚蠢。

这基本上是我的问题:你在通常的地方找到的关于RX的所有解释都让(至少我(感到愚蠢。他们将RX解释为一个高度复杂的概念,其中包含许多高度复杂的单词和术语等等,我从来都不太确定它是关于什么的。

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

所以,LINQ(

在JavaScript中,这些是高级数组方法,如mapfilterreduce等 - 如果你不是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数据来放置延迟、窗口或对管道进行采样。在这种情况下,我会在更新进度条之前每秒对数据进行采样。

列表与事件

所以列表和事件有点相同。区别在于数据是通过系统拉取还是推送。使用列表提取数据。通过事件推送数据。

相关内容

  • 没有找到相关文章