事件触发器。
eventEmitter.on():用于注册监听器;
eventEmitter.emit():用于触发事件;
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发事件');
});
myEmitter.emit('event');
eventEmitter.emit()方法可以传任意数量的参数到监听器函数。
当监听器函数被调用时,this关键词被指向监听器所绑定的EventEmitter实例。
当使用ES6de箭头函数作为监听器,this不会指向EventEmitter实例。
EventEmitter以注册的顺序同步调用所有监听器。
监听器函数可以使用setImmediate()和process.nextTick()方法切换到异步的操作模式。
const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) => {
setImmediate(() => {
console.log('异步地发生');
});
});
myEmitter.emit('event', 'a', 'b');
eventEmitter.on()注册监听器时,监听器会在每次触发命名事件时调用。
eventEmitter.once()可以注册最多可调用一次的监听器,当事件被触发时,监听器会被注销,然后再调用。
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 打印: 2
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 不触发
EventEmitter实例出错时,应该触发error事件,
如果没有为error事件注册监听器,当error事件触发时,会抛出错误、打印堆栈跟踪、并退出Node进程。
为了防止崩溃Node进程,可以使用domain模块,不推荐。
最佳是应该始终为error事件注册监听器
const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
console.error('错误信息');
});
myEmitter.emit('error', new Error('错误'));
// 打印: 错误信息
由events模块定义。
const EventEmitter = require('events');
当新增监听器时,会触发newListener事件;
当移除已存在的监听器时,则触发removeListener事件;
emitter.addListener(eventName, listener):emitter.on(eventName, listener)的别名。
emitter.emit(eventName[, …args]):按照监听器注册的顺序,同步调用每个注册到名为eventName事件的监听器。
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
// 第一个监听器。
myEmitter.on('event', function firstListener() {
console.log('第一个监听器');
});
// 第二个监听器。
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`第二个监听器中的事件有参数 ${arg1}、${arg2}`);
});
// 第三个监听器
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`第三个监听器中的事件有参数 ${parameters}`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// 第一个监听器
// 第二个监听器中的事件有参数 1、2
// 第三个监听器中的事件有参数 1, 2, 3, 4, 5
emitter.eventNames():返回已注册监听器的事件名数组。