Node.js 解释事件驱动编程

Node.js 解释事件驱动编程

Node.js中的事件驱动编程: 与其他类似技术相比,Node.js广泛使用事件,其中之一就是它速度快的原因。一旦我们启动了一个Node.js服务器,它会初始化变量和函数,然后监听事件的发生。

事件驱动编程用于同步多个事件的发生并使程序尽可能简单。事件驱动程序的基本组件包括:

  • 当事件触发时会调用一个回调函数(也称为事件处理程序)。
  • 一个事件循环,监听事件触发并调用相应的事件处理程序。

Node.js 解释事件驱动编程

如果一个函数监听某个事件的触发,被称为“观察者”。当发生事件时,观察者会被触发。Node.js提供了一系列已经内置的事件。这些“事件”可以通过“events”模块和EventEmitter类访问。Node.js的大多数内置模块都继承自EventEmitter类。

EventEmitter: EventEmitter是一个允许对象相互通信的Node模块。Node的异步事件驱动架构的核心就是EventEmitter。Node的许多内置模块都继承自EventEmitter。

这个思路很简单 – 发射器对象发送命名事件,触发已注册的监听器。因此,一个发射器对象具有两个关键特征:

  • 发射命名事件: 表示某个事件发生的信号被称为发射事件。发射对象的状态变化通常是此条件的原因。
  • 注册和注销侦听器函数: 指的是将回调函数与相应的事件绑定和解绑。

    事件驱动编程原则:

  • 一组用于处理事件的函数。根据实现方式可以是阻塞的或非阻塞的。

  • 将已注册的函数绑定到事件。
  • 当接收到已注册的事件时,事件循环轮询新事件并调用相应的事件处理程序。

    实现:文件名:app.js

// Import the 'events' module 
const events = require('events'); 
  
// Instantiate an EventEmitter object 
const eventEmitter = new events.EventEmitter(); 
  
// Handler associated with the event 
const connectHandler = function connected() { 
    console.log('Connection established.'); 
  
    // Trigger the corresponding event 
    eventEmitter.emit('data_received'); 
} 
  
// Binds the event with handler 
eventEmitter.on('connection', connectHandler); 
  
// Binds the data received 
eventEmitter.on( 
    'data_received', function () { 
        console.log('Data Transfer Successful.'); 
    }); 
  
// Trigger the connection event 
eventEmitter.emit('connection'); 
  
console.log("Finish");
JavaScript

上面的代码片段将名为’connectHandler’的处理程序与事件’connection’绑定。当事件被触发时,回调函数会被触发。

使用以下命令运行app.js文件:

node app.js
JavaScript

输出:

Connection established.
Data Transfer Successful.
Finish
JavaScript

事件驱动编程的优势:

  • 灵活性: 当需要时更容易修改代码的部分。
  • 适用于图形界面: 允许用户直接从工具栏中选择工具(如单选按钮等)。
  • 编程简单性: 它支持预测性编码,提高程序员的编码体验。
  • 容易找到自然的划分线: 自然的划分线对于单元测试基础设施来说很容易找到。
  • 对于建模系统来说是一种好方法: 用于建模必须是异步和反应式的系统的有用方法。
  • 允许更多交互式程序: 它使得更多的交互式编程成为可能。事件驱动编程在几乎所有最近的GUI应用程序中都被使用。
  • 使用硬件中断: 可以通过硬件中断实现,降低计算机的功耗。
  • 允许传感器和其他硬件: 它使传感器和其他硬件与软件之间的通信变得简单。

事件驱动编程的缺点:

  • 复杂: 简单的程序变得不必要复杂。
  • 逻辑性和明显性较差: 程序的流程通常更不逻辑性且更为明显。
  • 难以找到错误: 调试事件驱动程序很困难。
  • 令人困惑: 程序中太多的表单可能会令人困惑和/或沮丧。
  • 紧密耦合: 事件模式将与模式的使用者紧密耦合。
  • 阻塞: 复杂的操作阻塞。

事件驱动编程与面向对象编程的关系: 我们可以将面向对象编程(OOP)和事件驱动编程(EDP)组合起来,在同一段代码中一起使用。

使用OOP时如何区分是否有EDP: 对象之间的控制流是OOP与没有EDP之间的区别。在没有EDP的OOP中,方法调用时控制流从一个对象流向另一个对象。对象的主要功能是调用其他对象的方法。

而在有EDP的OOP中,当发生事件通知时,控制流从一个对象移动到另一个对象。对象订阅来自其他对象的通知,等待那些对象的通知,根据通知执行工作,然后发布自己的通知。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册