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. 《剑指Offer》第二章(一)题 9 -12

    第二章 面试题9:用两个栈实现队列 题目:如面试题,给你两个栈, 实现队列的先进先出,即在队列头删除一个元素以及在队列的尾部添加一个元素 思路:这个题的分析感觉很巧妙,从一个具体的例子入手,找出其中的 ...

  2. 微信小程序开发技巧总结 (一)-- 数据传递和存储

    结合自己在平时的开发中遇到的各种问题,和浏览各种问题的解决方案总结出一些自己在日常开发中常用的技巧和知点,希望各位不吝斧正. 1.短生命周期数据存储 以小程序启动到彻底关闭为周期的的数据建议存储在ap ...

  3. 必知必会之Lambda表达式

    Java是一门强大的面向对象的语言,除了8种基本的数据类型,其他一切皆为对象.因此,在Java中定义函数或方法都离不开对象,也就意味着很难直接将方法或函数像参数一样传递,而Java8中的Lambda表 ...

  4. 强连通分量——tarjan算法

    概念: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通.如果有向图G的每两个顶点都强连 ...

  5. MongoDB 复本集搭建

    复制集的特点   数据一致性 主是唯一的,但不是固定的  没有MySQL那样的双主结构 大多数原则,集群存活节点小于等于二分之一时集群不可写,只可读. 是否能选举出新的主节点,是由当前复制集成员存活量 ...

  6. c++ bool

    bool 就两个值,真或者假,通常用来存储关系表达式或者逻辑表达式的结果. 以前是用 int 来表示真假,大 int 有多个值,所以才规定 0 为假,非零为真,导致对应关系比较麻烦,有了 bool 就 ...

  7. Mysql 保存emoji表情报错

    保存emoji表情错误 首先错误表现,抛出业务层报错之外,根源的数据库错误是: sql 错误码 1366 字符集相关错误. uncategorized SQLException; SQL state ...

  8. new function 到底做了什么?如何自己实现new function

    前言 这是继function 与 Function 关系后写下的. 写这个起源于,我无聊的时候看到一道题目: 'foo' == new function() { var temp=String('fo ...

  9. You (oracle) are not allowed to use this program (crontab)

      检查一台ORACLE数据库服务器的crontab作业(用户为oracle,实际环境中可能为oracle.也有可能是其它用户)时,发现出现下面提示信息: $ crontab -l You (orac ...

  10. JS DOM用不同方法获取节点及对节点插入、复制和移除

    操作节点的方法 appendChild() insertBefore() replaceChild() cloneNode() normalize() splitText() sppendChild( ...