nodejs events

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');
原文地址:https://www.cnblogs.com/lianglanlan/p/8716409.html