Node.js事件模块events

 2015年11月24日    406     声明


Node.js的异步I/O操作使用事件机制实现,Node 中里很多对象都是events.EventEmitter的实例,如:net.Server在建立连接时和连接断开时都会分发事件,fs模块在打开和读取文件时也会分发对应的事件。Node.js通过events模块实现事件机制,该模块中有唯一的类EventEmitter

  1. 类:events.EventEmitter
  2. EventEmitter类中的事件及属性
  3. EventEmitter类实例方法


1. 类:events.EventEmitter

可以使用以下方法获取对EventEmitter类的引用:

// v 0.10.x 以前的版本
var EventEmitter = require('events').EventEmitter;

// v 0.10.x 以后的版本
var EventEmitter = require('events');

EventEmitter实例发生错误时,会抛出'error'事件,如果这个事件没有被监听,Node会在控制台打一个堆栈信息并退出程序。

通过引用并继承EventEmitter类,就可以实现一个事件发射器。当事件发射器添加新的监听器时,会触发'newListener'事件,当移除事件监听时,会触发'removeListener'事件。

示例,继承EventEmitter类:

'use strict';
const util = require('util');
const EventEmitter = require('events');

function MyEventEmitter() {
  // 初始化`EventEmitter`this实例上必要的属性
  EventEmitter.call(this);
}

// 继承`EventEmitter`原型链上的方法
util.inherits(MyEventEmitter, EventEmitter);


2. EventEmitter类中的事件及属性

2.1 事件:'newListener'

添加listener的时候会触发这个事件,这个事件被触发的时,listener可能还没添加到listener监听器数组中。添加任何新的事件监听器后,'newListener'事件的回调函数都会在该监听器被添加前回调。


2.2 事件:'removeListener'

删除listener的时候会触发这个事件。当这个事件触发的时候,listener可能还还没从listener数组移除,该事件被移除前,会调用该事件的回调函数。


2.3 属性:defaultMaxListeners

通过实例方法emitter.setMaxListeners(n)可以设置的每个实例的最大listener数,但如果实例未设置时,将使用EventEmitter.defaultMaxListeners


3. EventEmitter类实例方法

3.1 添加监听器:emitter.addListener()

emitter.addListener(event, listener)

emitter.on(event, listener)的别名方法。


3.2 发送事件:emitter.emit()

emitter.emit(event[, arg1][, arg2][, ...])
  • event:String,事件名
  • [, arg1][, arg2][, ...]:发送给监听器的参数
  • 返回值:Boolean

提供的参数按顺序执行指定事件的listener,如果事件存在listener则返回true,否则返回false


3.3 最大可添加监听器数:emitter.getMaxListeners()

emitter.getMaxListeners()

返回当前实例最大可添加监听器数,其数量为emitter.getMaxListeners(n)方法设置的数量或EventEmitter.defaultMaxListeners

emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', function () {
  // 一些操作
  emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});


3.4 返回事件的监听器数:emitter.listenerCount()

emitter.listenerCount(type)
  • type:String,事件类型
  • 返回值:Number

返回type类型事件的监听器数。


3.5 返回事件的监听器数:emitter.listeners()

emitter.listeners(event)
  • event:String,事件名
  • 返回值:Array

返回event事件的listener数组。

server.on('connection', function (stream) {
  console.log('一些连接!');
});
console.log(util.inspect(server.listeners('connection'))); // [ [Function] ]


3.6 添加事件监听器:emitter.on()

emitter.on(event, listener)
  • event:String,事件名
  • listener:Function,给事件添加的监听器函数
  • 返回值:emitter

添加一个监听器到指定事件event 的监听数组的末尾。触发器不会检查是否已经添加过这个listener,多次调用相同的eventlistener 将会导致 listener 添加多次。

server.on('connection', function (stream) {
  console.log('一些连接!');
});


3.7 添加一次性事件监听器:emitter.once()

emitter.once(event, listener)
  • event:String,事件名
  • listener:Function,给事件添加的监听器函数
  • 返回值:emitter

添加一个一次性的监听器到指定事件event的监听数组的末尾,该监听器将在下次收到事件时触发,并在触发后被删除。

server.once('connection', function (stream) {
  console.log('Ah, 这是个一次性的事件');
});


3.8 移除所有监听器:emitter.removeAllListeners()

emitter.removeAllListeners([event])
  • event:String,可选参数,事件名
  • 返回值:emitter

移除所有事件监听器,或移除指定事件event的监听器。

server.once('connection', function (stream) {
  console.log('Ah, 这是个一次性的事件');
});


3.9 移除指定事件的指定监听器:emitter.removeListener()

emitter.removeListener(event, listener)
  • event:String,事件名
  • listener:Function,要移除的事件监听函数
  • 返回值:emitter

从一个事件eventlistener数组中删除一个listener

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);


3.10 设置最大可添加监听器数:emitter.setMaxListeners()

emitter.setMaxListeners(n)
  • n:Number,数量
  • 返回值:emitter

默认情况下,EventEmitter可添加监听器数为10,当超过10个时会发出警告,以此防止内存泄露。如果你所需要的添加的监听器数超过10个,可以通过emitter.setMaxListeners(n)方法进行修改。当设置为Infinity0时,表示没有没有数量限制。