EventEmitter--Node.js 事件驱动的核心

一、介绍

Node.js 中的许多对象都会分发事件,例如:

  • net.Server 对象在每次有新连接时触发事件。

  • fs.readStream 对象在文件被打开时触发事件。

所有这些事件对象都是 events.EventEmitter 的实例。EventEmitter 是 Node.js 中用于创建、注册和触发事件的核心模块,实现了事件驱动编程的基础。

二、引入 events 模块

var events = require('events');
var eventEmitter = new events.EventEmitter();

三、基本用法示例

var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();

event.on('some_event', function() {
    console.log('some_event 事件触发');
});

setTimeout(function() {
    event.emit('some_event');
}, 1000);

执行结果:

some_event 事件触发

四、事件绑定多个监听器

var events = require('events');
var emitter = new events.EventEmitter();

emitter.on('someEvent', function(arg1, arg2) {
    console.log('listener1', arg1, arg2);
});

emitter.on('someEvent', function(arg1, arg2) {
    console.log('listener2', arg1, arg2);
});

emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

执行结果:

listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

五、EventEmitter 方法

序号方法描述
1addListener(event, listener)添加监听器到监听器数组的尾部
2on(event, listener)绑定事件
3once(event, listener)绑定一次性监听器
4removeListener(event, listener)移除指定监听器
5removeAllListeners([event])移除所有监听器
6setMaxListeners(n)设置最大监听器数量
7listeners(event)返回监听器数组
8emit(event, [arg1], [arg2], [...])触发事件

六、once() 注册一次性事件

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

myEmitter.once('init', () => {
  console.log('Initialization event occurred');
});

myEmitter.emit('init'); // 打印: Initialization event occurred
myEmitter.emit('init'); // 不会再触发

七、监听 error 事件

myEmitter.on('error', (err) => {
  console.error('Error event triggered:', err);
});

myEmitter.emit('error', new Error('Something went wrong'));

执行结果:

Error event triggered: Error: Something went wrong

八、EventEmitter 事件

序号事件描述
1newListener添加新监听器时触发
2removeListener删除监听器时触发

九、listenerCount() 获取监听器数量

var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");

十、继承 EventEmitter

Node.js 核心模块(如 HTTP、fs)都是 EventEmitter 的子类。

继承示例:

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const customEmitter = new MyEmitter();
customEmitter.on('customEvent', () => {
  console.log('Custom event fired');
});

customEmitter.emit('customEvent');

执行结果:

Custom event fired

十一、结论

  • EventEmitter 提供了事件的发布与订阅机制,适用于事件驱动编程。

  • 可以使用 on 绑定事件,使用 emit 触发事件。

  • once 绑定一次性事件,removeListener 用于移除事件监听。

  • EventEmitter 允许继承,以创建自定义事件驱动对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值