差异主要与如何您“配置”(或声明)事物约定有关:当其他事情发生时,某事会发生什么。
在反应式编程中,您声明对更改的反应。您不必预先预见该更改所需的这种反应,您可以在以后随时添加 - declare - 这种反应。因此,它可能被视为“拉动”或“观察”策略。
因此,在反应式编程中,您连接到/观看您知道存在的数据。数据在这里至关重要。
示例:用户点击页面上的项目 -> 更新计数器用户点击了多少次。
示例计算器应用程序:计算器显示屏绑定到所有按钮,并根据显示屏上的任何更改(点击按钮)做出反应。按钮不知道他们的点击可以被任何其他部分利用。
在事件驱动编程中,您在命令式编写的代码中触发特定情况中的事件。您需要在这里明确说明,因为需要先触发事件才能稍后接收 - 因为基本上您 push 在代码的“更改发生”部分中的事件。所以这是一种“推动”策略。
因此,在事件驱动编程中,您推动在某种情况中可能会发生的事件被代码的其他部分接收。情况在这里很重要,数据无关紧要。
示例:有人访问了联系页面 -> 触发了一个事件(最终可能不会被任何监听器接收到,这是许多模块和库的典型情况)。
计算器应用示例:计算器显示只是一个监听器,按钮触发事件。按钮需要知道它们存在于特定上下文中(但是 - 由于事件侦听器模式 - 不必知道该上下文到底是什么),因此它们需要触发事件。
所以在大多数情况下,它们只是不同的约定。
看看这个简单的例子。命令式方法示例:
event: perform some operation on a, e.g. a += value, and trigger the event
listener: counter++
以及反应式声明方法示例:
counter: whenever an operation on a occurs, react with this: counter++
在最后一个示例中无需触发任何事情 - 您只需对可能发生的任何事情“挂钩”反应。
那么,您可能会说,在响应式方法中,该反应绑定到 a,而在命令式事件驱动方法中,您推送一个事件,该事件稍后可以被侦听器接收 - 因为这种方法不相关无论如何,您可以将其更改为:a += value 以后再更改为其他任何内容,甚至完全删除 a。事件驱动的方法本质上与数据无关。
如您所见,响应式编程是面向数据的(数据的更改会与触发其他代码发生反应),而事件驱动的编程是面向流程的(无论数据是否发生变化以及发生什么变化(如果有的话)都无关紧要 - 你只需触发将由代码的其他部分接收的事件)。在后一种情况下,您需要知道这需要“通知”代码的其他部分,然后您必须预见应该触发事件。在前一种情况下,您不必这样做,您可以随时这样做,或者根本不这样做——不需要触发事件——但这里的诀窍是必须有你可以与之挂钩的“东西”你的反应声明,一种观察者,可以让你对观察到的变化做出反应。