首页 > 编程语言 >【Node】【4】事件循环和EventEmitter类

【Node】【4】事件循环和EventEmitter类

时间:2024-08-25 18:23:48浏览次数:8  
标签:Node arg1 arg2 EventEmitter events 循环 事件 someEvent emitter

事件循环

事件驱动:node中程序的执行是由事件的发生和相应的事件处理器(eventHandler)来驱动的编程范式。

程序监听并响应发生的事件。每个异步事件都生成一个事件观察者,在执行某个事件(主题)结束的时候则触发这个事件上的处理函数(观察者)。【让我瞅瞅什么时候开始执行,例如点击事件后要打印一段文字,打印一段文字这个函数(观察者)时刻关注什么时候有了点击事件(主题)】

事件循环:

Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)

在这里插入图片描述

举个例子:

// 引入 events 模块
const events = require('events');
// 创建 eventEmitter 对象
const eventEmitter = new events.EventEmitter();
 
// 创建事件处理程序
const connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}
 
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});
 
// 触发 connection 事件 
eventEmitter.emit('connection');
 
console.log("程序执行完毕。");

这段 Node.js 代码演示了如何使用 events 模块创建事件和事件处理程序。当事件被触发时,相关的事件处理程序会被执行。以下是代码的执行流程:

  1. 首先,创建了一个 EventEmitter 实例 eventEmitter,它用于处理事件的注册、触发和监听。
  2. 定义了一个名为 connectHandler 的事件处理程序,它会在 connection 事件被触发时输出 连接成功。 并且触发 data_received 事件。
  3. connectHandler 事件处理程序绑定到 connection 事件上,这样当 connection 事件被触发时,connectHandler 会被执行。
  4. 使用匿名函数绑定了 data_received 事件,该函数在 data_received 事件被触发时输出 数据接收成功。
  5. 触发了 connection 事件,这会导致 connectHandler 被执行,输出 连接成功。 并触发 data_received 事件。
  6. data_received 事件被触发时,匿名函数会被执行,输出 数据接收成功。
  7. 最后,输出 程序执行完毕。

在这里插入图片描述

事件处理是异步的。当触发 connection 事件时,Node.js 将 connectHandlerdata_received 事件放入事件队列,等待事件循环执行。因此,"程序执行完毕。"语句会在事件处理完成后才执行。

EventEmitter类

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列,比如一个 fs.readStream 对象会在文件被打开的时候触发一个事件,这些产生事件的对象都是events.EventEmitter 的 实例。

对于每个事件,EventEmitter 支持 若干个事件监听器。

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

在这里插入图片描述

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 

// 和on方法一样
emitter.addListener('someEvent', function(arg1, arg2) {
    console.log('listener2', arg1, arg2);
})

// 只会触发一次
emitter.once('someEvent', function(arg1, arg2) {
    console.log('listener3', arg1, arg2);
})

emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

在这里插入图片描述

移除某个监听器和移除全部。

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 

// 只会触发一次
emitter.once('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 

// 和on方法一样
emitter.addListener('someEvent', function(arg1, arg2) {
    console.log('listener2', arg1, arg2);
})

const fun = function(arg1, arg2) {
    console.log('listener3', arg1, arg2);
}
emitter.on('someEvent', fun)

emitter.emit('someEvent', 'arg1参数', 'arg2参数'); 
console.log(emitter.listeners('someEvent')); // listener1 不会再打印,因为执行一次就被删除了
emitter.removeListener('someEvent', fun) // 删除某个监听器

emitter.emit('someEvent', 'arg1参数', 'arg2参数');
emitter.removeAllListeners('someEvent');

标签:Node,arg1,arg2,EventEmitter,events,循环,事件,someEvent,emitter
From: https://blog.csdn.net/qq_43720551/article/details/141532401

相关文章

  • 基于Node.js+vue四川省非物质文化遗产之传统美术数字平台设计与实现(程序+论文+开题报
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在全球化与现代化的浪潮中,非物质文化遗产作为民族文化的瑰宝,正面临着传承与保护的严峻挑战。四川省,作为中华文化的重要发源地之一,拥有丰富的非物质文化遗产......
  • 基于Node.js+vue外卖系统(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展和智能设备的普及,人们的生活方式正经历着深刻的变革。其中,外卖服务作为互联网+餐饮行业的典型代表,以其便捷性、多样性和高效性迅速......
  • 基于Node.js+vue水产养殖生产管理系统(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着农业现代化进程的加速,水产养殖业作为农业的重要组成部分,正逐步向规模化、智能化、精细化管理转变。然而,传统水产养殖管理模式存在信息孤岛、效率低下、......
  • 基于Node.js+vue人事系统(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着企业规模的扩大与业务复杂度的提升,传统的人事管理方式已难以满足高效、精准的管理需求。人力资源管理作为企业发展的核心驱动力之一,其信息化、智能化水......
  • 基于Node.js+vue数码论坛系统设计与实现(程序+论文+开题报告)-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字化生活已成为人们不可或缺的一部分,其中数码产品作为连接现实与虚拟世界的桥梁,其热度与影响力日益增强。众多数码爱好者渴望有......
  • 基于nodejs+vuevivi[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在当今数字化时代,电子商务平台的蓬勃发展极大地改变了人们的消费习惯,推动了商业模式的创新。随着移动互联网技术的普及,消费者对购物体验的需求日益个性化与......
  • 基于nodejs+vuevegetableMarket[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着城市化进程的加快和消费者健康意识的提升,蔬菜市场作为日常生活中不可或缺的一部分,其运营模式与效率正面临着新的挑战与机遇。传统的蔬菜市场往往存在信......
  • 基于nodejs+vueUhome记录生活[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着科技的飞速发展,智能家居与数字化生活已成为现代家庭的新常态。在这样的背景下,"Uhome记录生活"应运而生,旨在通过构建一个集用户管理、家庭成员互动、家庭......
  • 基于nodejs+vueTVCBOOK灵感创作[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在数字化时代,创意产业蓬勃发展,成为推动经济增长和社会进步的重要力量。TVCBOOK灵感创作平台应运而生,旨在构建一个集用户交流、优秀作品展示、作品分类管理、......
  • 循环结构
    循环结构whilefordowhile加强for循环针对数组和集合对象,遍历数组或集合对象for(类型变量名:数组或集合对象)//把数组或集合对象中每个对象按顺序赋给冒号前的变量{}break,continue,gotobreak:跳出当前循环continue:跳过当次循环,继续执行下一次......