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. How to do if sqlserver table identity column exceed limited ?

    script: select a.TABLE_NAME,a.COLUMN_NAME,a.DATA_TYPE, (CASE a.DATA_TYPE when 'int' then 'limited be ...

  2. 【机器学习】算法原理详细推导与实现(六):k-means算法

    [机器学习]算法原理详细推导与实现(六):k-means算法 之前几个章节都是介绍有监督学习,这个章解介绍无监督学习,这是一个被称为k-means的聚类算法,也叫做k均值聚类算法. 聚类算法 在讲监督 ...

  3. C#开源组件DocX版本区别点滴

    在C#中,需要处理Office Word文档时,由于MsOffice Com的版本局限性,所以选择不与本机MsOffice安装与否或安装版本相关的软件,以便软件或使用时的通用性与版权限制,特别是对于国 ...

  4. 配置ASA防火墙 远程管理方式

          受不了,asa和思科路由器 系统命令不一致,这一篇专门来写asa.      先看下版本 asa825# show version      Cisco Adaptive Security ...

  5. [CentOS7 mini]Linux命令补全 yum install bash-completion

    CentOS7 mini默认不带命令补全需要自行安装 使用国内yum清华源 安装完后退出当前窗口再登录生效 # yum install -y bash-completion 已加载插件:fastest ...

  6. 将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1

    目录 前言 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 消失了 升级到 ASP.NET Core 3.1 项目文件(.csproj) Program. ...

  7. NetCore3.0实现自定义IOC容器注入

    在之前的ASP.NET MVC实现依赖注入一文中,通过替换默认的ControllerFactory来达到对Controller生命周期的拦截,实现自定义的对象注入,在NetCore3.0中需要重新实现 ...

  8. Windows Server 2012 R2的安装(GUI桌面版本)

    镜像:cn_windows_server_2012_r2_x64_dvd_2707961.iso 1.将安装光盘插入服务器,开机会读取到Windows安装程序,点击下一步 2.点击现在安装     3 ...

  9. 二、Nginx配置实例

    Nginx配置实例 一.反向代理 实例一 1.实现效果 打开浏览器,在浏览器地址栏输入地址 www.123.com ,跳转到linux系统tomcat主页面中. 2.准备工作 在linux系统中安装t ...

  10. notepad中运行python, --kali安装后出现乱码

    notepad中运行python cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT - ...