小册
这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习
- 古代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); }}
以上代码实现了on
、emit
、removeListener
办法,别离用于增加事件监听器、触发事件和移除事件监听器。
四、测试自定义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 2bus.removeListener('event', event2);bus.emit('event');// Output:// Event 1
五、总结
EventEmitter
是Node.js中十分重要的一个模块,它实现了事件驱动的基本模式,让Node.js具备了解决异步操作的能力。咱们也能够通过简略实现一个自定义的EventEmitter
来更好地了解其原理和用法。
参考文献
- Node.js官网文档 - events模块
- Node.js EventEmitter源码解析
- Node.js事件模块EventEmitter的简略实现