1.Events
例子,一个绑定了一个监听器的 EventEmitter 实例。 eventEmitter.on() 方法用于注册监听器,eventEmitter.emit() 方法用于触发事件。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEimitter = new MyEmitter;
myEimitter.on('event', () => {
console.log("触发了一个事件!")
});
myEimitter.emit('event');
2.给监听器传入参数与 this
eventEmitter.emit() 方法允许将任意参数传给监听器函数。 当一个普通的监听器函数被 EventEmitter 调用时,标准的 this 关键词会被设置指向监听器所附加的 EventEmitter。
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', function (a, b) {
console.log(a, b, this);
});
myEmitter.emit('event', 'a', 'b');
// Prints:
// a b MyEmitter {
// domain: null,
// _events: { event: [Function] },
// _eventsCount: 1,
// _maxListeners: undefined }
可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) =>{
console.log(a, b, this);
});
myEmitter.emit('event', 'a', 'b');
// Print: a b {}
3.只处理事件一次
当使用 eventEmitter.on() 方法注册监听器时,监听器会在每次触发命名事件时被调用。 也可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Prints: 2
使用这个eventEmitter.once()方法,可以注册一个最多被调用一次的特定事件的监听器。一旦事件发出,监听器就被取消注册,然后被调用。
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Ignored
4.错误事件
使用这个eventEmitter.once()方法,可以注册一个最多被调用一次的特定事件的监听器。一旦事件发出,监听器就被取消注册,然后被调用。
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('error', (error) => {
console.log('whoops! There was an error.')
});
myEmitter.emit('error' , new Error('whoops!'));
5.事件newlistener
该EventEmitter实例将发出它自己的’newListener’事件之前 的侦听器添加到其内部的监听者数组。
注册了’newListener’事件的监听器将被传递事件名称和引用被添加的监听器。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// Only do this once so we don't loop forever
myEmitter.once('newListener', (event, listener) => {
if (event === 'event') {
//嵌入一个新的监听器
myEmitter.on('event', () => {
console.log('B');
});
}
});
myEmitter.on('event', () => {
console.log('A');
});
myEmitter.emit('event');
// Prints:
// B
// A
6.listenerCount
一个类方法,返回给定eventName 注册给定的给定的监听器的数量emitter。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Print: 3
7.emitter.eventNames()
一个类方法,返回给定eventName 注册给定的给定的监听器的数量emitter。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Print: 3
8.emitter.listeners(eventName)
返回名为的事件的侦听器数组的副本eventName。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
server.on('connection', (stream) => {
console.log('Someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
9.emitter.on(eventName,listener)
默认情况下,事件侦听器按照它们添加的顺序被调用。该 emitter.prependListener()方法可以用作将侦听器添加到侦听器数组开头的替代方法。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEE = new MyEmitter();
myEE.on('foo', () => { console.log('a') });
myEE.prependListener('foo', () => { console.log('b') });
myEE.emit('foo');
// Print: B
// Print: A
10.emitter.removeListener(eventName,listener)
removeListener将从监听器数组中最多删除一个监听器实例。如果任何单个侦听器已多次添加到指定的侦听器数组中eventName,则removeListener必须多次调用以删除每个实例。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB)
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Print: A
// Print: B
// callbackB is now removed
// Internal listener array [callbackA]
myEmitter.emit('event');
// Print: A