Node.js
的异步I/O操作使用事件机制实现,Node
中里很多对象都是events.EventEmitter
的实例,如:net.Server在建立连接时和连接断开时都会分发事件,fs模块在打开和读取文件时也会分发对应的事件。Node.js
通过events
模块实现事件机制,该模块中有唯一的类EventEmitter
。
-
类:
events.EventEmitter
-
EventEmitter
类中的事件及属性 -
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
,多次调用相同的event
和listener
将会导致 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
从一个事件event
的listener
数组中删除一个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)
方法进行修改。当设置为Infinity
或0
时,表示没有没有数量限制。