NodeJs之events

events

事件触发器。

eventEmitter.on():用于注册监听器;
eventEmitter.emit():用于触发事件;

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('触发事件');
});
myEmitter.emit('event');

将参数和this传给监听器

eventEmitter.emit()方法可以传任意数量的参数到监听器函数。
当监听器函数被调用时,this关键词被指向监听器所绑定的EventEmitter实例。
当使用ES6de箭头函数作为监听器,this不会指向EventEmitter实例。

异步 VS 同步

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('错误'));
// 打印: 错误信息

EventEmitter类

由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():返回已注册监听器的事件名数组。

你可能感兴趣的:(Node)