面试官:说说Node中的EventEmitter? 如何实现一个EventEmitter?

面试官:说说Node中的EventEmitter? 如何实现一个EventEmitter?

一、什么是EventEmitter?

在Node.js中,EventEmitter是事件驱动的基础,几乎所有模块都继承自它。它实现了观察者模式,其中被观察者维护一组观察者,并在更新时通知观察者。

EventEmitter允许对象绑定和触发事件监听器,实现异步操作。在Node.js中,许多对象都会分发事件,例如fs.readStream对象会在文件被打开时触发一个事件。

二、使用EventEmitter

Node.js的events模块提供了一个EventEmitter类,可以通过继承它创建自定义事件对象。

基本使用方法如下:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

function callback() {
    console.log('触发了event事件!');
}

myEmitter.on('event', callback);
myEmitter.emit('event');
myEmitter.removeListener('event', callback);

EventEmitter的常用方法有:

  • on(eventName, listener): 添加类型为eventName的事件监听器。
  • once(eventName, listener): 添加类型为eventName的事件监听器,但只能执行一次,执行后将被删除。
  • prependListener(eventName, listener): 添加类型为eventName的事件监听器到事件数组头部。
  • emit(eventName, ...args): 触发类型为eventName的事件监听器。
  • removeListener(eventName, listener): 移除类型为eventName的事件监听器。

三、实现自定义EventEmitter

我们可以简单实现一个EventEmitter类,了解其基本原理。在实现过程中,需要维护一个包含所有事件的对象events

class EventEmitter {
    constructor() {
        this.events = {};
    }

    on(type, handler) {
        if (!this.events[type]) {
            this.events[type] = [];
        }
        this.events[type].push(handler);
    }

    emit(type, ...args) {
        if (!this.events[type]) {
            return;
        }
        this.events[type].forEach((handler) => {
            handler.apply(this, args);
        });
    }

    removeListener(type, handler) {
        if (!this.events[type]) {
            return;
        }
        this.events[type] = this.events[type].filter((item) => item !== handler);
    }
}

以上代码实现了onemitremoveListener方法,分别用于添加事件监听器、触发事件和移除事件监听器。

四、测试自定义EventEmitter

const bus = new EventEmitter();

bus.on('event', () => {
    console.log('Event 1');
});

function event2() {
    console.log('Event 2');
}

bus.on('event', event2);

bus.emit('event');
// Output:
// Event 1
// Event 2

bus.removeListener('event', event2);
bus.emit('event');
// Output:
// Event 1

五、总结

EventEmitter是Node.js中非常重要的一个模块,它实现了事件驱动的基本模式,让Node.js具备了处理异步操作的能力。我们也可以通过简单实现一个自定义的EventEmitter来更好地理解其原理和用法。

参考文献

评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linwu-hi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值