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');
posted @ 2015-12-09 23:14  山月水风  阅读(641)  评论(0编辑  收藏  举报