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

news2024/9/20 15:05:28

事件循环

事件驱动: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');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SVN项目的文件泄露分析和漏洞修复

说明:本文仅是用于学习分析自己搭建的SVN漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 …

信息学奥赛初赛天天练-75-NOIP2016普及组-完善程序-二分答案、二分查找、贪心算法、贪心策略

文章PDF链接: https://pan.baidu.com/s/1SVcGU_rApvoUWrUoviPCiA?pwdht2j 提取码: ht2j 复制这段内容后打开百度网盘手机App,操作更方便哦 1 完善程序 (单选题 ,每小题3分,共30分) 郊游活动 有 n名同学参加学校组织的郊游活动&#xff0c…

gateway的学习

1.网关的作用 1.负载均衡 2.过滤器的使用 1.通过配置文件实现的过滤器 2.代码逻辑层面实现全局过滤器 //全局过滤器代码逻辑实现 Component //Order(1):注解配置过滤器的执行顺序 public class GlobalFilter implements GatewayFilter, Ordered {/*** 处理当前请求,…

RocketMQ~高性能设计与实现(零拷贝技术)、多种集群模式

与Kafka类似,RocketMQ也使用了零拷贝技术、对于分区,其也有分队列的思维在。 零拷贝技术 传统的IO读写其实就是readwrite的操作,整个过程会分为如下几步 用户调用read()方法,开始读取数据,此时发生一次上下文从用户…

Storage:Keeping memories in the brain(存储:把记忆保存在大脑中)

Once you’ve encoded information, you now need to store it. Unfortunately, forgetting is a major part of how our brains work.Most of us can’t remember what we had for dinner Tuesday, three weeks ago.However, we can all remember our first kiss. 一旦完成了信…

工厂模式和策略模式的区别和各自的实现

工厂模式和策略模式是两种不同的设计模式,它们分别解决的是创建对象和定义算法家族的问题。 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使…

如何发布年会通知?

在组织年会等重要活动时,确保每位参与者都能及时接收到通知至关重要。本文将指导您如何利用云分组平台发布年会通知,并通过查询功能为参与者提供座位号等信息。一、电脑端上传查询信息 1. 登录云分组官网 访问官网并通过微信扫码登录。2. 进入查询菜单 在…

通过因子分析识别消费者偏好的潜在因素的案例

因子分析是一种统计方法,用于研究变量之间的潜在关系。它是一种降维技术,通过识别较少数量的因子(或称为维度、成分)来解释多个观测变量之间的相关性。这些因子是不可观测的潜在变量,它们被认为是原始变量的潜在原因。…

厦门凯酷全科技有限公司抖音小店的新蓝海开启电商新篇章

在数字经济的浪潮中,电子商务以其独特的魅力和无限潜力,正以前所未有的速度改变着我们的消费方式和商业模式。作为这股浪潮中的佼佼者,厦门凯酷全科技有限公司凭借其敏锐的市场洞察力和前瞻性的战略布局,成功在抖音小店这一新兴平…

乐凡北斗卫星通信终端,多场景应用

北斗卫星通信终端在民生保障、抗险减灾、野外搜救、海洋渔业、交通运输、边境巡防等多个领域都有广阔的应用空间。在不同场景下,乐凡北斗卫星通信终端发挥着各自独特而关键的作用,其强大的定位功能和北斗三代短报文功能保障了信息的高效传递和任务的顺利…

Context-dependence:Why your environment matters(情境依赖:为什么环境很重要)

Consider an everyday situation:You get up from your desk to have a cup of tea.Once you arrive in the kitchen, you forget what you wanted.However, when you get back to your desk, you suddenly remember. 考虑一个日常会遇到的情况:你从桌旁起身想要倒杯茶&#xf…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化:计算机加电后进行硬件检测。加载引导程序,将Linux内核加载到内存中。 内核初始化:内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Chat App 项目之解析(四)

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以…

Nature Communications | 全球草地土壤碳储量随植物多样性的增加而增加

在许多生态系统中物多样性与土壤有机碳(SOC)储量呈正相关。最可能的原因是植物多样性积极影响植物生产力,从而影响土壤的有机碳输入量。大多数关于植物多样性对植物生产力和有机碳储量影响的证据都是基于控制植物物种丰富度的小规模实验。然而,那些短期的…

Flink入门(五)--Flink算子

Map DataStream → DataStream 一个接受一个元素并产生一个元素的函数。 示例 dataStream.map { x > x * 2 } FlatMap DataStream → DataStream 一个接受一个元素并产生零个、一个或多个元素的函数。 例如 dataStream.flatMap { str > str.split(" ") }…

把直播间搬到工厂,淘宝直播打造卖爆新路径

又一年中秋将至,电商平台们再度开启了月饼生意。 8月21日,杭州,淘宝直播的主播们组成“白月光”队和“黑月牙”队,下工厂,探访体验馆,开始了一场“寻月之旅”。“我们米月饼的饼皮是根据南宋糕点改良而来”…

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

【CSP:202212-2】训练计划(Java)

题目链接 202212-2 训练计划 题目描述 求解思路 模拟: over表示能否按时完成所有训练项目rely[i]表示第i个项目的依赖项目编号(每个项目最多有一个依赖项目)days[i]用来记录第i个项目完成需要的天数allDays[i]表示加上该项目的所有前置依赖…

面向对象09:instanceof和类型转换

‌ 本节内容视频链接:https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p72&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 instanceof是Java中的一个二元运算符&…

浅谈【数据结构】栈和队列之队列

目录 1、队列 1.1思想 2、队列的两类 2.1顺序队列 2.2链式队列 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助,一起努力吧&a…