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
    事件的数量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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() 来完成对象的继承。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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重写一下继承,发现es6的语法糖挺简单的。

1
2
3
4
5
6
7
8
9
10
11
12
13
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');