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. Part2-求AX=b的最优解

    自己一边听课一边记得,参考网上广为流传的那本<MIT线性代数笔记>,转成Latex上传太麻烦,直接截图上传了,需要电子版的可以私信我.

  2. Python3(八) 枚举详解

    一.枚举其实是一个类 建议标识名字用大写 1.枚举类: from enum import Enum class VIP(Enum):     YELLOW = 1     GREEN = 2      ...

  3. 关于开源,Git,Github

    在Github和Git上fork之简单指南 https://linux.cn/article-4292-1.html,中文翻译 https://www.dataschool.io/simple-gui ...

  4. rm -f 后如何恢复

    前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...

  5. grep知识及常用用法梳理

    1. grep语法及其参数说明 grep是文本搜索工具,能根据用户指定的'PATTERN模式'目标文本进行逐行匹配检查,注意grep默认会以 行 为单位打印匹配到的行. 以下是grep命令的语法及常用 ...

  6. solr常用操作及集成分词器或cdh集群部署说明

    首先,如果是从http://lucene.apache.org/solr/下载的solr,基本都是自带集成的jetty服务,不需要单独搭建tomcat环境,但是要注意jdk版本,直接解压通过cmd命令 ...

  7. Java 中常见排序算法

    经典的排序算法总结 冒泡排序算法 算法描述: 比较相邻的元素:如果第一个比第二个大,就交换它们两个: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数: 针 ...

  8. Android中自定义xml文件给Spinner下拉框赋值并获取下拉选中的值

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  9. 泡泡后台Couchbase缓存使用经验分享

    一.导读 爱奇艺的社交业务“泡泡”,拥有日活用户6千万+,后台系统每日高峰期间接口QPS可以达到80K+,与视频业务的主要区别是泡泡业务更多地引入了与用户互动相关的数据,读.写的量均很大.无论是庞大的 ...

  10. mysql必知必会--联 结 表

    联结 SQL最强大的功能之一就是能在数据检索查询的执行中联结(join) 表.联结是利用SQL的 SELECT 能执行的最重要的操作,很好地理解联结 及其语法是学习SQL的一个极为重要的组成部分 外键 ...