2016-02-10 76 views
0

最近,在JavaScript中,推动了反应式编程,并将所有内容制作成可以订阅的流。反应流和事件监听器之间有什么区别?

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

这些方法都不是“反应性”的,因为它们都订阅点击,例如?

+1

在流中,数据可以由处理程序“推”或“拉”,但是在监听程序的情况下,它们总是被“推送”到相应的处理程序。 – BatScream

+1

流是一个函子。 – Bergi

回答

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。

相关问题