在基于 Node.js 的开发中,我们经常会用到事件驱动编程。事件驱动编程的实现需要一个事件管理器来注册、触发和监听事件,并且要使事件机制尽量简单易用。这就是 Node.js 中的 EventEmitter 所做的事情。
EventEmitter 简介
EventEmitter 是 Node.js 模块中的一个核心模块(即不需要安装就可以使用),是一个事件驱动编程的工具,用于支持基于观察者模式的程序设计思想。它提供了一个事件监听器的注册机制,可以通过触发命名事件来同步或异步地调用已注册的监听器函数。同时也是异步编程中的一个重要组件。
在 Node.js 中使用 EventEmitter 最简单的方式是通过实例化 EventEmitter 类的对象,然后调用实例对象的方法来注册事件。
EventEmitter 使用示例
下方代码是一个简单的示例,演示了如何使用 EventEmitter 进行事件驱动编程。
-- -------------------- ---- ------- ----- ------------ - ------------------ -- --- ------------ ----- ------- - --- --------------- -- ------- ------------------- ------ ----- -- - ------------------------ ----- ------ --- -- ------- ------------------- ------ ----- -- - ------------------------ ----- ------ --- -- ---- --------------------- ----- ---- ----- -----
输出结果:
listener1 arg1 参数 arg2 参数 listener2 arg1 参数 arg2 参数
在上面的示例中,我们新建了 EventEmitter 实例,并注册了名为 event
的事件。在注册事件时,我们使用了 on
方法,它是 EventEmitter 实例上的一种方法,用于在实例上注册给定名称的事件的监听器。当事件被触发时,所有注册给定名称事件的监听器都会被调用。最后,我们使用 emit
方法触发 event
事件,同时向事件处理函数传递两个参数。在本例中输出了两个监听器的处理结果。
EventEmitter 的事件处理器
在 EventEmitter 中,每个事件都由一个事件名(字符串类型)和一个事件处理器(函数类型)组合成。
on(eventName, listener)
此方法用于注册一个名为 eventName 的事件监听器,listener 是一个回调函数,用于指定当事件触发时需要调用的代码逻辑。
emitter.on('event', (args) => { console.log('事件触发了: ', args); });
addListener(eventName, listener)
此方法与 on(eventName, listener)
方法作用一致,使用方式也相同。推荐使用 on
方法。
emitter.addListener('event', (args) => { console.log('事件触发了: ', args); });
once(eventName, listener)
此方法用于注册一个名为 eventName 的事件监听器,listener 是一个回调函数,用于指定当事件第一次触发时需要调用的代码逻辑。这个监听器只会触发一次,在触发后会自动移除,不需要手动移除。
emitter.once('event', (args) => { console.log('事件触发了: ', args); });
removeListener(eventName, listener)
此方法用于移除指定 eventName 的指定 listener。
const listener = (args) => { console.log('事件触发了: ', args); }; emitter.on('event', listener); emitter.removeListener('event', listener);
注意:使用
removeListener
方法移除事件监听器,需要传入完全相同的 listener 函数才能生效。使用removeAllListeners
方法可以移除 eventName 事件所有的监听器。
removeAllListeners([eventName])
该方法用于移除所有或指定 eventName 事件的所有监听器。
emitter.removeAllListeners('event');
EventEmitter 的实现原理
EventEmitter 的实现就是将事件和对应的监听器逐一存储在一个对象中。在触发对应的事件时,Node.js 会遍历该存储对象,依次执行对应的监听器。由于 EventEmitter 事件驱动编程是单线程的异步编程,因此该过程可以实现多个事件同时执行,每个事件只需要等待自己对应的监听器执行完毕即可,不会阻塞其他事件的执行。
总结
本文介绍了 Node.js 中自带的事件驱动库 EventEmitter 的基本使用方法和事件处理器,同时通过实例代码进行了演示。EventEmitter 的实现原理是将事件和对应的监听器逐一存储在一个对象中,实现了单线程的事件驱动编程,可以实现多个事件的同时执行。深入学习和熟练使用 EventEmitter 对于 Node.js 的事件驱动编程至关重要,相信读者通过本文的介绍,可以更好地理解和掌握该工具的使用和实现原理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6648e96ed3423812e47a0f66