EventEmitter类

events模块提供一个对象:events.EventEmitter,核心是事件触发和事件监听的封装。

大多数时候不会直接使用EventEmitter,而是在对象中继承它(new一个出来)。

方法:

on:

为指定事件注册一个监听器,接收一个字符串event和一个回调函数。

emit:

触发事件。返回值为布尔值。

once:

为指定事件注册一个单次监听器,最多只会触发一次,触发后立刻解除该监听器。

addListener:

为指定事件添加一个监听器到监听器数组的尾部。

removeListener:

移出指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。接收两个参数,一个是事件名称,第二个是回调函数名称。

removeAllListeners:

移除所有事件的监听器,如果指定事件,则移除指定事件的所有监听器。

listeners:

返回指定事件的监听器数组。

示例:

//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); var listener1 = function listener1() {
console.log('监听器1执行');
}; var listener2 = function listener2() {
console.log('监听器2执行');
}; emitter.on('someEvent', listener1); emitter.on('someEvent', listener2); var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent'); console.log(eventListeners + '个监听器'); //2个监听器 emitter.emit('someEvent'); //移除第一个监听器listenter1
emitter.removeListener('someEvent', listener1); var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent'); console.log(eventListeners + '个监听器'); //1个监听器 console.log('程序执行完毕');

执行:

$ node test.js
2个监听器
监听器1执行
监听器2执行
1个监听器
程序执行完毕

setMaxListeners:

默认情况下,EventEmitters超过10个监听器就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量。

示例:

//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); emitter.on('someEvent', function () {
console.log('监听器1执行');
});
emitter.on('someEvent', function () {
console.log('监听器2执行');
});
emitter.on('someEvent', function () {
console.log('监听器3执行');
});
emitter.on('someEvent', function () {
console.log('监听器4执行');
});
emitter.on('someEvent', function () {
console.log('监听器5执行');
});
emitter.on('someEvent', function () {
console.log('监听器6执行');
});
emitter.on('someEvent', function () {
console.log('监听器7执行');
});
emitter.on('someEvent', function () {
console.log('监听器8执行');
});
emitter.on('someEvent', function () {
console.log('监听器9执行');
});
emitter.on('someEvent', function () {
console.log('监听器10执行');
});
emitter.on('someEvent', function () {
console.log('监听器11执行');
}); emitter.emit('someEvent');

命令行执行:

$ node test.js
监听器1执行
监听器2执行
监听器3执行
监听器4执行
监听器5执行
监听器6执行
监听器7执行
监听器8执行
监听器9执行
监听器10执行
监听器11执行
(node:10112) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 someEvent listeners added. Use emitter.setMaxListeners() to increase limit

当绑定的监听器超过10个时,虽然程序顺利执行,但是抛出了警告。如下所示,就不会发出警告了。要添加在监听器绑定的前面。

//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); emitter.setMaxListeners(11); //提高监听器的默认限制数量 emitter.on('someEvent', function () {
console.log('监听器1执行');
});
emitter.on('someEvent', function () {
console.log('监听器2执行');
});
emitter.on('someEvent', function () {
console.log('监听器3执行');
});
emitter.on('someEvent', function () {
console.log('监听器4执行');
});
emitter.on('someEvent', function () {
console.log('监听器5执行');
});
emitter.on('someEvent', function () {
console.log('监听器6执行');
});
emitter.on('someEvent', function () {
console.log('监听器7执行');
});
emitter.on('someEvent', function () {
console.log('监听器8执行');
});
emitter.on('someEvent', function () {
console.log('监听器9执行');
});
emitter.on('someEvent', function () {
console.log('监听器10执行');
});
emitter.on('someEvent', function () {
console.log('监听器11执行');
}); emitter.emit('someEvent');

监听事件的最大额度并不是为所有事件分配的,例如下面代码,不会发出监听器数量警告

var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter(); emitter.on('someEvent', function () {
console.log('监听器1执行');
});
emitter.on('someEvent', function () {
console.log('监听器2执行');
});
emitter.on('someEvent', function () {
console.log('监听器3执行');
});
emitter.on('someEvent', function () {
console.log('监听器4执行');
});
emitter.on('someEvent', function () {
console.log('监听器5执行');
});
emitter.on('someEvent', function () {
console.log('监听器6执行');
});
emitter.on('someEvent2', function () {
console.log('监听器7执行');
});
emitter.on('someEvent2', function () {
console.log('监听器8执行');
});
emitter.on('someEvent2', function () {
console.log('监听器9执行');
});
emitter.on('someEvent2', function () {
console.log('监听器10执行');
});
emitter.on('someEvent2', function () {
console.log('监听器11执行');
}); emitter.emit('someEvent');
emitter.emit('someEvent2');

nodejs events的更多相关文章

  1. nodejs events模块

    var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); console.log(emi ...

  2. Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动

    1. Nodejs 的单线程 非阻塞 I/O 事件驱动在 Java. PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程.而每个线程需要耗费大约 2MB 内存.也就是说,理论 ...

  3. Nodejs入门级基础+实战

    这篇随笔将会按序记录如下内容: NodeJs 简介 安装  NodeJs HTTP 模块.URL 模块 CommonJs 和 Nodejs 中自定义模块 NodeJs FS 模块 利用 HTTP 模块 ...

  4. 十九、Node.js-非阻塞IO、异步以及 '事件驱动EventEmitter'解决异步

    1.Nodejs 的单线程 非阻塞 I/O 事件驱动 在 Java.PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程而每个线程需要耗费大约 2MB 内存.也就是说,理论上, ...

  5. nodejs报错 events.js:72 throw er; // Unhandled 'error' event

    var http = require('http'); var handlerRequest = function(req,res){ res.end('hello');}; var webServe ...

  6. nodejs显现events.js:72抛出错误

    随着人们开始学习,我用nodejs过程中遇到如下列错误执行: events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EAD ...

  7. nodeJS之事件events

    前面的话 events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Nod ...

  8. 深入出不来nodejs源码-events模块

    这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...

  9. nodejs出现events.js:72中抛出错误 Error: listen EADDRINUSE

    <pre>events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoExce ...

随机推荐

  1. 03(a)多元有约束优化问题(准备知识)

    转成Latex上传太麻烦,直接截图上传了,需要电子版的可以关注一下,微信公众号:“实干小海豹”,回复:”优化01a“,”优化01b“,”优化02a“,”优化02b“,”优化02c“,”优化02c“.. ...

  2. Rust入坑指南:步步为营

    俗话说:"测试写得好,奖金少不了." 有经验的开发人员通常会通过单元测试来保证代码基本逻辑的正确性.如果你是一名新手开发者,并且还没体会到单元测试的好处,那么建议你先读一下我之前的 ...

  3. 图像里的"白噪声"——电视机搜不到台时雪花斑点的形成原因

    作者:❄️固态二氧化碳❄️ (主页) 链接:图像里的"白噪声"--电视机搜不到台时雪花斑点的形成原因 - 固态二氧化碳的博客 - CSDN博客 来源:CSDN博客 发表时间:201 ...

  4. ELF文件之四——使用链接脚本-2个函数-data

    main.c ; int main() { ; } int add() { ; } main.o 反汇编可以看到多了.text节的反汇编,存储的是全局变量的初始化数值 main.o对比,text段后面 ...

  5. STM32,ARM,Keil工具相关

    One ELF Section per Function https://blog.csdn.net/iceiilin/article/details/6091575 因此,可以得出,选项One EL ...

  6. Unable to update index for nexus-publish | http://ip:port/repository/maven-public/

    问题描述:Unable to update index for nexus-publish | http://ip:port/repository/maven-public/ 解决方案:进入工作空间. ...

  7. 用C语言实现中国象棋

    基于五子棋框架上的 象棋 小游戏 本游戏是上各种水课无聊时的产物...不参考现有游戏从零开始实现各项功能. 游戏配置:二维数组,循环系统,wasd基本移动,调整窗台的函数,以及富足的发呆时间.. 完整 ...

  8. mybatis 通过配置父类数据源连接和关闭数据,进行junit单元测试

    来源:https://blog.csdn.net/Bigbig_lyx/article/details/80646005 解决问题,单元测试没经过单独配置,每个测试方法中要添加配置数据源 一:配置父类 ...

  9. 来简单说说var,let,const,function,import,class

    一.var和let var已经在JavaScript中存在很长一段时间了,但是它存在了一些不足的地方,接下来我们就来看看吧 首先var存在变量提升,这是怎么一回事呢,我们看下面代码 为什么是它呢,是因 ...

  10. HA: Chakravyuh Vulnhub Walkthrough

    靶机链接: https://www.vulnhub.com/entry/ha-chakravyuh,388/ 主机探测扫描: 端口扫描: ╰─ nmap -p- -sC -sV 10.10.202.1 ...