Javascript 什么';反应流和事件侦听器之间的区别是什么?

Javascript 什么';反应流和事件侦听器之间的区别是什么?,javascript,stream,reactive-programming,Javascript,Stream,Reactive Programming,最近,在javascript中,有一种趋势是采用反应式编程,使所有内容都成为可以订阅的流 然而,订阅流和通过动作侦听器订阅事件之间有什么区别 这两种方法不是都是“反应式”的吗?因为它们都是订阅点击的,例如?都可以被认为是事件处理器,但它们的区别/优势有多种形式 第一个区别在于事件侦听器和流的形式。事件侦听器一次只处理一个事件。反应流是monad,这意味着您可以在事件上映射函数,使用转换的信息发出新流,合并流,合成流,等等 其次,引用流允许您将变量声明为事件的结果,使所有状态逻辑保持在同一位置 c

最近,在javascript中,有一种趋势是采用反应式编程,使所有内容都成为可以订阅的流

然而,订阅流和通过动作侦听器订阅事件之间有什么区别


这两种方法不是都是“反应式”的吗?因为它们都是订阅点击的,例如?

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

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

其次,引用流允许您将变量声明为事件的结果,使所有状态逻辑保持在同一位置

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


在流中,数据可以由处理程序
推送
拉送
,但对于侦听器,它们总是
推送
到相应的处理程序。流是一个函子。