NodeJs简明教程(7)

2019年7月22日 · 236 字 · 2 分钟

本文是NodeJs简明教程的第七篇,将介绍NodeJs events模块相关的基本操作。

大多数 Node.js 核心 API 构建于惯用的异步事件驱动架构,其中某些类型的对象(又称触发器,Emitter)会触发命名事件来调用函数(又称监听器,Listener)。

快速开始

使用事件监听器一般包含以下操作:

  1. 新建事件监听器实例
  2. 设置监听函数
  3. 触发事件
const EventEmitter = require('events'); // 引用模块

class MyEmitter extends EventEmitter {} // 初始化监听器

const myEmitter = new MyEmitter();

myEmitter.on('event', () => { // 设置监听函数
  console.log('an event occurred!');
});

myEmitter.emit('event'); // 触发事件

以上例程会输出an event occurred!

一次性事件监听

上文中的监听方式事件触发几次就会输出几次an event occurred!,有些事件可能是一次性的。这时候可以使用once监听。

const EventEmitter = require('events'); // 引用模块

class MyEmitter extends EventEmitter {} // 初始化监听器

const myEmitter = new MyEmitter();

myEmitter.once('event', () => { // 设置监听函数
  console.log('an event occurred!');
});

myEmitter.emit('event'); // 触发事件
myEmitter.emit('event'); // 触发事件

以上例程会输出1次 an event occurred!;

同一事件多次监听

上文中的监听方式都是只有1个监听函数,通过多次调用on可以设置多个监听函数。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', () => { // 监听器1
  console.log('监听器1收到事件');
});

myEmitter.on('event', () => { // 监听器2
  console.log('监听器2收到事件');
})

myEmitter.emit('event'); // 触发事件

以上例程会输出

监听器1收到事件
监听器2收到事件

接收事件参数

  1. emit函数的第一个值为事件名,后续参数为事件值
  2. ononce等监听器设置函数的回调函数收到的值为emit传入的事件参数
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', (param1,param2,param3) => { // 接收事件参数
  console.log('收到事件',param1,param2,param3);
});

myEmitter.emit('event','参数1','参数2',{name:'参数3'}); // 发送事件参数

以上例程会输出

收到事件 参数1 参数2 { name: '参数3' }

获取事件监听器上所有事件

使用eventNames()实例方法获取监听器上所有事件

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', (param1,param2,param3) => {
  console.log('收到事件',param1,param2,param3);
});

myEmitter.once('event2',() => {
  console.log('收到事件2');
});

console.log(myEmitter.eventNames());

以上例程输出[ 'event', 'event2' ]

移除事件监听器

使用off实例方法移除单个监听器

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

const callback = (param1) => {
  console.log(param1);
};

myEmitter.on('event', callback); // 添加监听器

myEmitter.off('event', callback); // 移除监听器

myEmitter.emit('event'); // 触发事件

以上例程没有输出,因为先添加监听器,随后移除,触发事件时已经没有可用的监听器了

移除所有监听器

使用removeAllListeners([eventName])实例方法移除所有监听器

  1. removeAllListener不传参数时移除该emitter实例所有事件监听器
  2. removeAllListener传入字符串参数时移除该emitter实例所有该事件的监听器

结语

事件系统是NodeJs的灵魂,在几乎所有的I/O模块都有使用,希望各位读者好好掌握。