nodejs中EventEmitter
在模块events中,定义了一个EventEmitter类,可以使用var EventEmitter = require('events');
访问它。基本上所有发送事件的对象都是继承自EventEmitter。有基本属性和方法如下。
- setMaxListeners(n)
设置事件的最大监视者数量 - getMaxListeners(n)
获取事件的最大监视者数量 - on(event, listener)/addListener(event, listener)
为事件增添一个监视者 - once(event, listener)
为事件增添一个一次监视者 - removeListener(event, listener)
为事件删除一个监视者,注意listener指向同一个事件监听函数。 - removeAllListeners([event])
如果无参数,移除所有事件的监视者。如果参数为event,移除该事件的监视者。 - listenerCount(event)
获取特定事件的监视者数量。 - listeners(event)
获取特定事件的监听者列表。 - _eventsCount
事件的数量
var EventEmitter = require('events');
var em = new EventEmitter();
em.setMaxListeners(2);
var start = (data) => console.log(`data ${data} start`);
var end = (data) => console.log(`data ${data} end`);
em.on('data', start);
em.on('data', end);
em.once('close', () => console.log('close...'));
console.log(`the max listeners value: ${em.getMaxListeners()}`);
console.log(`the number of event: ${em._eventsCount}`);
console.log(`the number of listeners the data event: ${em.listenerCount('data')}`);
console.log(`the number of listeners the data close: ${em.listenerCount('close')}`);
setInterval(() => {
em.emit('data', 'eat');
em.emit('data', 'play')
em.emit('close');
}, 1000);
setTimeout(() => {
em.removeListener('data', start);
em.removeListener('data', end);
}, 3000);
写一个继承EventEmitter的对象。使用 util.inherits()
来完成对象的继承。
var EventEmitter = require('events');
var util = require('util');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function (data){
this.emit('write', data);
}
var stream = new MyStream();
stream.on('write', function(data) {
console.log(data);
});
stream.write('hello, world');
再用ES6的class重写一下继承。
var EventEmitter = require('events');
class MyStream extends EventEmitter {
write(data) {
this.emit('write', data);
}
}
var stream = new MyStream();
stream.on('write', data => console.log(data));
stream.write('hello, world');
stream.write('hello, world');
stream.write('hello, world');