NodeJs简明教程(7)
2019年7月22日 · 236 字 · 2 分钟
本文是NodeJs简明教程的第七篇,将介绍NodeJs events模块相关的基本操作。
大多数 Node.js 核心 API 构建于惯用的异步事件驱动架构,其中某些类型的对象(又称触发器,Emitter)会触发命名事件来调用函数(又称监听器,Listener)。
快速开始
使用事件监听器一般包含以下操作:
- 新建事件监听器实例
- 设置监听函数
- 触发事件
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收到事件
接收事件参数
emit
函数的第一个值为事件名
,后续参数为事件值
on
和once
等监听器设置函数的回调函数收到的值为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])实例方法移除所有监听器
。
- removeAllListener
不传参数
时移除该emitter实例
上所有
事件监听器 - removeAllListener传入
字符串
参数时移除该emitter实例
上所有该事件
的监听器
结语
事件系统是NodeJs的灵魂,在几乎所有的I/O模块都有使用,希望各位读者好好掌握。