Node.jsEventEmitter菜鸟教程

Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时触发一个事件,一个fs.readStream对象会在文件被打开的时候触发一个事件。所有这些产生事件的对象都是events.EventEmitter的实例。

EventEmitter是Node.js中用于创建、注册和触发事件的核心模块。

EventEmitter是事件驱动编程的基础,可以帮助开发者轻松实现事件的发布与订阅机制。

events模块只提供了一个对象:events.EventEmitter。

EventEmitter的核心就是事件触发与事件监听器功能的封装。

你可以通过require("events");来访问该模块。

EventEmitter对象如果在实例化时发生错误,会触发error事件。当添加新的监听器时,newListener事件会触发,当监听器被移除时,removeListener事件被触发。

下面我们用一个简单的例子说明EventEmitter的用法:

运行这段代码,1秒后控制台输出了some_event事件触发。其原理是event对象注册了事件some_event的一个监听器,然后我们通过setTimeout在1000毫秒以后向event对象发送事件some_event,此时会调用some_event的监听器。执行结果如下:

$nodeevent.jssome_event事件触发EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。

当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

让我们以下面的例子解释这个过程:

执行以上代码,运行的结果如下:

$nodeevent.jslistener1arg1参数arg2参数listener2arg1参数arg2参数以上例子中,emitter为事件someEvent注册了两个事件监听器,然后触发了someEvent事件。

运行结果中可以看到两个事件监听器回调函数被先后调用。这就是EventEmitter最简单的用法。

EventEmitter提供了多个属性,如on和emit。on函数用于绑定事件函数,emit属性用于触发一个事件。接下来我们来具体看下EventEmitter的属性介绍。

server.on('connection',function(stream){console.log('someoneconnected!');});3once(event,listener)为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。server.once('connection',function(stream){console.log('Ah,wehaveourfirstuser!');});4removeListener(event,listener)移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

它接受两个参数,第一个是事件名称,第二个是回调函数名称。

varcallback=function(stream){console.log('someoneconnected!');};server.on('connection',callback);//...server.removeListener('connection',callback);5removeAllListeners([event])移除所有事件的所有监听器,如果指定事件,则移除指定事件的所有监听器。6setMaxListeners(n)默认情况下,EventEmitters如果你添加的监听器超过10个就会输出警告信息。setMaxListeners函数用于改变监听器的默认限制的数量。7listeners(event)返回指定事件的监听器数组。8emit(event,[arg1],[arg2],[...])按监听器的顺序执行执行每个监听器,如果事件有注册监听返回true,否则返回false。类方法序号方法&描述1listenerCount(emitter,event)返回指定事件的监听器数量。events.EventEmitter.listenerCount(emitter,eventName)//已废弃,不推荐events.emitter.listenerCount(eventName)//推荐注册一个事件监听器:

输出:

Hello,Alice!使用once()注册一次性事件:

myEmitter.once('init',()=>{console.log('Initializationeventoccurred');});myEmitter.emit('init');//打印:InitializationeventoccurredmyEmitter.emit('init');//不会再触发事件触发时可以传递参数,供监听器使用:

如果触发的事件没有对应的监听器,EventEmitter会抛出错误:

event-字符串,事件名称

listener-处理事件函数

该事件在添加新监听器时被触发。

从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

以下实例通过connection(连接)事件演示了EventEmitter类的应用。

创建main.js文件,代码如下:

以上代码,执行结果如下所示:

$nodemain.js2个监听器监听连接事件。监听器listener1执行。监听器listener2执行。listener1不再受监听。监听器listener2执行。1个监听器监听连接事件。程序执行完毕。error事件EventEmitter定义了一个特殊的事件error,它包含了错误的语义,我们在遇到异常的时候通常会触发error事件。

当error被触发时,EventEmitter规定如果没有响应的监听器,Node.js会把它当作异常,退出程序并输出错误信息。

我们一般要为会触发error事件的对象设置监听器,避免遇到错误后整个程序崩溃。例如:

varevents=require('events');varemitter=newevents.EventEmitter();emitter.emit('error');运行时会显示以下错误:

为什么要这样做呢?原因有两点:

首先,具有某个实体功能的对象实现事件符合语义,事件的监听和发生应该是一个对象的方法。

其次JavaScript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系。

大多数Node.js核心模块(如HTTP、文件系统)都继承了EventEmitter,你可以创建自己的类来继承EventEmitter。

THMAIL

1、eventEmitter.on()与eventEmitter.addListener()没有区别,且一个事件可以绑定多个回调函数;

2、若事件队列中出现一个未绑定事件则触发error事件,若未绑定error事件则程序抛出异常结束执行

1.0版

187***17005@163.com

EventEmitter里面的error事件,EventEmitter即使绑定了error事件,也是不会输出的。而是会在控制台打印该异常的堆栈信息,并结束进程。获取异常只能通过trycatch。

eventEmitter.on('error',function(err){console.error('Error:',err);});我测试了一下,绑定error事件。只能自己触发,eventEmitter.emit('error');当没有错误时,会在控制台打印Error:undefined。有错误时,不会打印,直接打印该异常的堆栈信息,并结束进程。

tiandashu

107***5714@qq.com

1、使用类方法listenerCount获取指定事件的监听数量替代方案。

eventEmitter.listeners('connection').length2、removeListener('connection',callback);此处参数callback必须和监听器中的回调函数是同一个,否则不生效。

sakura_rain

271***2293@qq.com

如果大家学过类似的语言可以深切感受到,on和emit的真正含义。

举个例子:

//注册一个监听事件eventEmitter.on('time_delay_event',function(){console.log('time_delay_event执行',newDate().getTime());});//执行一次setTimeout(function(){eventEmitter.emit('time_delay_event');},2000);//在尝试一次setTimeout(function(){eventEmitter.emit('time_delay_event');},4000);on:注册emit:执行一次注册,不被销毁的情况下可以多次调用执行。

这也是它和once之间的区别。

Toad

gua***nlv@gmail.com

res.addListener("finish",()=>{console.log("serverresponseisfinished");});和

server.on("connection",()=>{console.log("aclienthasconnectedtotheserver!");});底层实现都是event模块来实现。可以通过查看NodeJS文档来看继承关系。

THE END
1.电子商务网站开发与建设JavaScript中用“>”或“<”操作符比较字符串大小时,它们只会比较这些字符的Unicode编码,而不考虑本地的顺序。 字符串类型的大小判断是一个字符和一个字符的比较,只要有字符不同就停止继续判断并返回比较结果。例如:"aBc"<"ab"; localeCompare方法可以实现汉字按拼音排序。 字符集范围Unicode编码(16进制)Unicode编码...https://www.jianshu.com/p/4168ba8ac876
2.4.手写一个EventEmitter实现事件发布订阅EventEmitter (事件派发器)是 Node.js 的核心模块 events 中的类,用于对 Node.js 中的事件进行统一管理,用 events 特定的 API 对事件进行添加、触发和移除等等,EventEmitter 的核心就是事件触发与事件监听器功能的封装。 简而言之,EventEmitter就是一个典型的发布订阅模式,实现了事件调度中心。 https://www.cnblogs.com/alwaysrun/p/17179936.html
3.检测到可能的EventEmitter内存泄漏检测到可能的EventEmitter内存泄漏 我收到以下警告: (node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace: at EventEmitter.<anonymous> (events.js:139:15) at EventEmitter.<anonymous> (node.js:385:29) at Server.<...https://m.imooc.com/wenda/detail/585770
4.eventemitterEventEmitterTargetClass() emitter[Symbol.toStringTag] emitter[Symbol.iterator]() emitter.entries() emitter.listenerCount(eventName) emitter.clear(eventName) emitter.removeAllListeners(eventName) emitter.on(eventName, listener) emitter.addListener(eventName, listener) ...https://gitee.com/masx200/event-emitter-target/
1.learnmorethemethodsontheeventemitterobjectNode.js - Event Emitter - The Node.js API is based on an event-driven architecture. It includes the events module, which provides the capability to create and handle custom events. The event module contains EventEmitter class. The EventEmitter object emihttps://www.tutorialspoint.com/nodejs/nodejs_event_emitter.htm
2.www.tup.tsinghua.edu.cn/upload/books/yz/086763需要挂载器件库文件。具体步骤参考3.2.4节。在弹出如图3.31所示界面时需要进行修改,修改结果如图3.33所示。 图3.33门级仿真设置 在进行门级仿真之前,VHDL设计文件需进行EDA Netlist Writer操作,获得底层网表文件。设置完成后单击Tools→GATE level Simulation,Quartus Prime会自动调用ModelSim Altera仿真器,弹出如图3.34所示...http://www.tup.tsinghua.edu.cn/upload/books/yz/086763-01.txt
3.如何用JavaScript在服务端写入json文件接下来呢,我们调用fs.createReadStream创建了一个ReadStream对象。ReadStream是Stream,也是EventEmitter。 fs.createReadStream方法原型如下: 第一个参数是文件路径,第二个参数是可选的JSON对象,用来指定打开文件的一些选项,默认值如下: autoClose属性默认为true,读完文件或读取出错时,文件会被自动关闭。fd属性可以关联一个...https://blog.51cto.com/u_16213560/11382713
4.如何实现一个EventEmitter?如何实现eventemitter在JavaScript中,EventEmitter类是一种创建、监听、触发自定义事件的机制。在Node.js中,EventEmitter类是events模块的一部分,但在普通的JavaScript环境中,我们可以自己实现一个简单的EventEmitter。 以下是一个基本的EventEmitter实现: classEventEmitter{ constructor() { ...https://blog.csdn.net/csdn_Levy/article/details/142748103
5.EventEmitter(v5.2.8)EventEmitter EventEmitter 让浏览器支持基于事件的 JavaScript 编程 GitHub仓库 版本: 5.2.8 文件: 全部 https://cdn.bootcdn.net/ajax/libs/EventEmitter/5.2.8/EventEmitter.js https://cdn.bootcdn.net/ajax/libs/EventEmitter/5.2.8/EventEmitter.min.js...https://www.bootcdn.cn/EventEmitter/
6.GitHubPlatform: win32, x64, 15267MB Node version: v13.11.0 CPU: 4 x AMD Ryzen 3 2200U with Radeon Vega Mobile Gfx @ 2495MHz --- EventEmitterHeatUp x 2,897,056 ops/sec ±3.86% (67 runs sampled) EventEmitter x 3,232,934 ops/sec ±3.50% (65 runs sampled) EventEmitter2 x 12,261...https://github.com/EventEmitter2/EventEmitter2
7.eventemitter3EventEmitter3 is a high performance EventEmitter. It has been micro-optimized for various of code paths making this, one of, if not the fastest EventEmitter available for Node.js and browsers. The module is API compatible with the EventEmitter that ships by default with Node.js but there are...http://www.npmjs.com/package/eventemitter3
8.JS的EventEmitter使用步骤详解这次给大家带来js的EventEmitter使用步奏详解,使用EventEmitter的注意事项有哪些,下面就是实战案例,一起来看一下。 2个多月前把 Github 上的 eventemitter3 和 Node.js 下的事件模块 events 的源码抄了一遍,才终于对JavaScript事件有所了解。 上个周末花点时间根据之前看源码的理解自己用 ES6 实现了一个 eventemitter...https://www.finclip.com/news/f/85054.html
9.Node.js中的EventEmitter类使用小结node.jsEventEmitter 是Node.js 中的一个核心模块,它提供了一种实现事件驱动编程的机制。它是一个基于观察者模式的类,用于在应用程序中处理事件和触发事件。Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, ...https://www.jb51.net/javascript/308041zak.htm
10.Node.js中的EventEmitter模块:基本概念使用方法和常见应用嘲...Node.js是一个基于事件驱动的JavaScript运行时环境,广泛用于服务器端开发。Node.js内置了一个强大的事件模块,称为EventEmitter。EventEmitter提供了一种处理事件和实现自定义事件的能力。 本文将详细介绍Node.js中的EventEmitter模块,包括其基本概念、使用方法和常见应用场景。 https://cloud.tencent.com/developer/article/2300304
11.EventEmitter事件触发器Node 中的很多对象都会触发事件,例如:一个TCP 服务器在收发每个数据流时都触发事件;子进程在退出时 会触发事件。所有能够触发事件的对象都是events.EventEmitter 的实例。 事件命名方式使用大小写分隔的风格。例如:'stream', 'data', 'messageBegin'。 可以将函数注册给对象,使其在事件触发时执行, 此类函数被称作‘...https://www.w3cschool.cn/nodejsdoc/nodejsdoc-753w27ci.html
12.事件与监听返回一个新的EventEmitter。这个EventEmitter没有内置任何事件。 events.observeKey() 启用按键监听,例如音量键、Home键。按键监听使用无障碍服务实现,如果无障碍服务未启用会抛出异常并提示开启。 只有这个函数成功执行后,onKeyDown,onKeyUp等按键事件的监听才有效。 https://www.kancloud.cn/theliang/autojs/2790145
13.eventemitter(opensnewwindow)如果EventEmitter没有为'error'事件注册至少一个监听器,则当'error'事件触发时,会抛出错误、打印堆栈跟踪、且退出 Node.js 进程。 constmyEmitter=newMyEmitter();myEmitter.emit('error',newError('whoops!'));// 抛出错误,并使 Node.js 崩溃 为了防止 Node.js 进程崩溃,可以在使用domain模块。 (注意,domain...https://www.nodeapp.cn/events.html
14.Node.js—Nodev12.16.1(LTS)As this is the first property on EventEmitter that is read-only this feature could be considered Semver-Major. The new feature has been reverted but could re-land in a future Semver-Minor release if a non breaking way of applying it is found....http://nodejs.org/en/blog/release/v12.16.1