现在很长一段时间,我试图总结我的周围RX头。 而且,是真的,我从来不知道我得到了它 - 或者不是。
今天,我发现了一个解释http://reactive-extensions.github.com/RxJS/其中-在我看来-是可怕的。 它说:
RxJS是事件的承诺是异步。
大。 这是一个充满复杂性,如果你没有什么RX左右,那句话后,你很像以前一样愚蠢丝毫的想法的句子。
这基本上是我的问题:所有在平时的地方,你找到关于RX的解释作出的(至少我)觉得愚蠢。 他们解释RX作为一个高度复杂的概念,有很多非常复杂的词汇和术语和任何,我从来没有完全确定它是什么。
所以我的问题是:你会如何解释RX的人谁是五岁? 我想它是什么明确的,风景如画的解释,什么是好,什么它的主要概念?
所以,LINQ(在JavaScript中,这些都是高层次的阵列的方法,如map
, filter
, reduce
,等等-如果你不是一个C#开发,只需更换,每当我提到“LINQ”)给你一堆工具,你可以适用于序列 (在粗意义上的“列表”),以过滤和转换输入到输出(又名“的列表,它实际上是对我有意思”)。 但是,什么是一个列表?
什么是一个列表?
列表,是一些元素 ,以特定的顺序 。 我可以采取任何列表并将其转换成与LINQ 更好的列表。
(不一定的排序顺序,但订单)。
事件是一个List
但是关于事件是什么? 让我们来订阅事件:
OnKeyUp += (o,e) => Console.WriteLine(e.Key)
>>> 'H'
>>> 'e'
>>> 'l'
>>> 'l'
>>> 'o'
嗯。 这看起来有些东西 ,在一个特定的顺序 。 现在突然破晓在你身上, 列表和事件是一样的!
如果列表和活动都是一样的....
......那么为什么我不能转换和过滤输入事件到更多有趣的活动 。 这就是RX是什么 。 它带你了解与序列处理,包括所有的LINQ运营商如选择和地点和骨料的一切,并将其应用到的事件。
十分简单。
回调是一个序列太
是不是回调只是基本上只发生一次事件? 是不是它基本上就像一个项目的列表? 原来它是和大约的Rx有趣的事情之一是,它让我们把具有相同的语言(即我们可以将二者结合起来,或等待甲醚或其他事件和回调(之类的东西地理位置请求),等等等等)。
随着保罗的出色答卷,我想补充拉VS推送数据的概念。
管道
让我们在会产生一系列的数字,并输出结果的一些代码的例子。 如果你认为这是一个尽头的小河你有一个producer
是为您创造新的号码,并在另一端你有一个consumer
是在做与这些数字的东西。
拉 - 素数表
比方说,在producer
中生成素数的列表。 通常你会有些功能产生号码列表,每一次它返回它会已经通过管道计算到下一个值推consumer
,这将输出数字到屏幕上。
总理发电机---> Console.WriteLine
在这种情况下,很容易看出, producer
正在做的大部分工作,而consumer
会围坐在等待producer
发送下一个值。 该consumer
是拉动管道,等待producer
返回下一个值。
推 - 从一个快速的过程进展%的事件(无)
好吧,让我们说你有正在处理百万个的函数。 每个项目需要毫秒的过程,然后将函数产生出它在多大程度上得到的百分比值。 所以很多进步的价值观,速度非常快。
在管道的另一端你有一个进度条。 现在,如果进度条是处理每一个更新的用户界面会阻止试图跟上值流。
1百万物品处理器--->进度条
在这种情况下的数据通过管道被推动 producer
,然后将consumer
被阻塞,因为数据太多被推它来处理。
反应允许你把延误,窗口,或取决于你希望如何采样管线consume
的数据。 在这种情况下,我将采样数据更新进度栏前每秒。
列出与事件
因此,列表和事件是有点相同。 所不同的是数据是否被拉动或通过系统推进 。 随着列表中的数据被上拉 。 随着事件的数据推 。