反应流和事件监听器之间有什么区别?

时间:2016-02-10 01:06:52

标签: javascript stream reactive-programming

最近,在javascript中,推动了反应式编程,并使所有内容成为您可以订阅的流。

但是,订阅流和通过动作侦听器订阅事件有什么区别?

这两种方法都不是“反应性的”,因为他们都订阅了点击吗?

1 个答案:

答案 0 :(得分:0)

两者都可以被认为是事件处理器,但区别/优势有多种形式。

第一个区别是事件监听器与流的形式。事件侦听器一次只处理一个事件。反应流是monad,这意味着您可以在事件上映射函数,使用转换后的信息发出新流,合并流,组合流等。

其次,引用this excellent answer,流可以让你根据事件声明变量,将所有状态逻辑保存在同一个地方。

counter := 0                               -- initial value

// ...
// Do other variable declarations, and bunch of other stuff.
// ... 

on buttonUp   = (counter := counter + 1)   -- change it later
on buttonDown = (counter := counter - 1)

如果没有流,你会保持逻辑规定计数器的值与计数器的声明分开。

与此相比,你需要了解的关于计数器的所有内容都在一个地方:

counter :: Behavior Int
counter = accumulate ($) 0
            (fmap (+1) buttonUp
             `union` fmap (subtract 1) buttonDown)

用简单的英语说:

  

计数器最初等于0。它的值将等于两个合并流的累积结果。一个在按下向上按钮时返回+1,另一个在按下向下按钮时返回-1。