Node.js 解释事件驱动编程
Node.js中的事件驱动编程: 与其他类似技术相比,Node.js广泛使用事件,其中之一就是它速度快的原因。一旦我们启动了一个Node.js服务器,它会初始化变量和函数,然后监听事件的发生。
事件驱动编程用于同步多个事件的发生并使程序尽可能简单。事件驱动程序的基本组件包括:
- 当事件触发时会调用一个回调函数(也称为事件处理程序)。
- 一个事件循环,监听事件触发并调用相应的事件处理程序。
如果一个函数监听某个事件的触发,被称为“观察者”。当发生事件时,观察者会被触发。Node.js提供了一系列已经内置的事件。这些“事件”可以通过“events”模块和EventEmitter类访问。Node.js的大多数内置模块都继承自EventEmitter类。
EventEmitter: EventEmitter是一个允许对象相互通信的Node模块。Node的异步事件驱动架构的核心就是EventEmitter。Node的许多内置模块都继承自EventEmitter。
这个思路很简单 – 发射器对象发送命名事件,触发已注册的监听器。因此,一个发射器对象具有两个关键特征:
- 发射命名事件: 表示某个事件发生的信号被称为发射事件。发射对象的状态变化通常是此条件的原因。
- 注册和注销侦听器函数: 指的是将回调函数与相应的事件绑定和解绑。
事件驱动编程原则:
-
一组用于处理事件的函数。根据实现方式可以是阻塞的或非阻塞的。
- 将已注册的函数绑定到事件。
-
当接收到已注册的事件时,事件循环轮询新事件并调用相应的事件处理程序。
实现:文件名:app.js
上面的代码片段将名为’connectHandler’的处理程序与事件’connection’绑定。当事件被触发时,回调函数会被触发。
使用以下命令运行app.js文件:
输出:
事件驱动编程的优势:
- 灵活性: 当需要时更容易修改代码的部分。
- 适用于图形界面: 允许用户直接从工具栏中选择工具(如单选按钮等)。
- 编程简单性: 它支持预测性编码,提高程序员的编码体验。
- 容易找到自然的划分线: 自然的划分线对于单元测试基础设施来说很容易找到。
- 对于建模系统来说是一种好方法: 用于建模必须是异步和反应式的系统的有用方法。
- 允许更多交互式程序: 它使得更多的交互式编程成为可能。事件驱动编程在几乎所有最近的GUI应用程序中都被使用。
- 使用硬件中断: 可以通过硬件中断实现,降低计算机的功耗。
- 允许传感器和其他硬件: 它使传感器和其他硬件与软件之间的通信变得简单。
事件驱动编程的缺点:
- 复杂: 简单的程序变得不必要复杂。
- 逻辑性和明显性较差: 程序的流程通常更不逻辑性且更为明显。
- 难以找到错误: 调试事件驱动程序很困难。
- 令人困惑: 程序中太多的表单可能会令人困惑和/或沮丧。
- 紧密耦合: 事件模式将与模式的使用者紧密耦合。
- 阻塞: 复杂的操作阻塞。
事件驱动编程与面向对象编程的关系: 我们可以将面向对象编程(OOP)和事件驱动编程(EDP)组合起来,在同一段代码中一起使用。
使用OOP时如何区分是否有EDP: 对象之间的控制流是OOP与没有EDP之间的区别。在没有EDP的OOP中,方法调用时控制流从一个对象流向另一个对象。对象的主要功能是调用其他对象的方法。
而在有EDP的OOP中,当发生事件通知时,控制流从一个对象移动到另一个对象。对象订阅来自其他对象的通知,等待那些对象的通知,根据通知执行工作,然后发布自己的通知。