关于前端:面试官说说Node中的EventEmitter-如何实现一个EventEmitter

8次阅读

共计 1854 个字符,预计需要花费 5 分钟才能阅读完成。

小册

这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习

  • 古代 JavaScript 高级小册
  • 深入浅出 Dart
  • 古代 TypeScript 高级小册
  • linwu 的算法笔记📒

一、什么是 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 来更好地了解其原理和用法。

参考文献

  • Node.js 官网文档 – events 模块
  • Node.js EventEmitter 源码解析
  • Node.js 事件模块 EventEmitter 的简略实现
正文完
 0