KOI Backend - eventEmitter

简介: KOI Backend - eventEmitter

本文介绍第二个环节。

Web shop发送请求给WebSocket服务器


wsServer.js: 直接把请求通过eventEmitter抛一个事件出去:

wsServer.js负责抛事件,不负责具体处理。

具体处理交给application层面的wsServerforWebShop.js处理:

来自Webshop的请求细节,line 120发送往Orchestra:

Node.js 的广阔宇宙中,eventEmitter 是一个基础且强大的组件,它赋予了事件驱动编程模型以生命力。理解 eventEmitter 的工作原理,不仅能帮助我们更好地掌握 Node.js 的事件驱动本质,还能让我们在构建高效、可扩展的应用程序时,更加得心应手。


eventEmitter 的核心概念

在深入探索之前,让我们首先明确 eventEmitter 是什么。简单来说,它是 Node.js events 模块提供的一个类,用于处理事件和监听器。这个机制允许对象eventEmitters)发出(emit)事件名称,并通过函数(事件监听器)响应这些事件。这种模式被称为观察者模式,eventEmitter 是其在 Node.js 中的实现。


如何使用 eventEmitter

要使用 eventEmitter,首先需要通过 require('events') 引入 Node.js 的 events 模块,并创建 eventEmitter 类的实例。以下是一个简单的示例,展示了如何创建 eventEmitter 实例并使用它:

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

const myEmitter = new MyEmitter();

// 监听事件
myEmitter.on('event', () => {
  console.log('事件触发了!');
});

// 触发事件
myEmitter.emit('event');


在这个示例中,myEmitter 对象监听了名为 event 的事件,并定义了一个简单的回调函数,当事件被触发时打印消息。通过调用 emit 方法并指定事件名称,我们触发了事件,导致打印了预期的消息。


事件监听器的注册与移除

eventEmitter 提供了多种方法来注册和移除事件监听器。最常用的方法是 .on(),它用于添加监听器到事件的监听器数组的末尾。还有 .once() 方法,它让监听器只触发一次,然后自动移除。如果需要从事件的监听器数组中移除特定监听器,可以使用 .off().removeListener() 方法。


异步与 eventEmitter

在 Node.js 中,事件监听器通常以同步方式调用,这意味着事件可以立即、按顺序触发。然而,我们也可以将异步函数作为监听器。这在处理如文件读写、网络请求等异步操作时特别有用。需要注意的是,即使使用异步监听器,eventEmitter 也保证了监听器的调用顺序。


错误处理

在使用 eventEmitter 时,错误处理非常重要。默认情况下,如果监听了 error 事件,则当 error 事件被触发时,Node.js 不会抛出异常,也不会导致程序终止。如果没有监听 error 事件,当 error 事件被触发时,Node.js 会抛出异常,可能导致程序崩溃。因此,良好的实践是始终监听 error 事件,并根据应用的需要进行适当处理。


eventEmitter 的高级特性

eventEmitter 还包括一些高级特性,如设置监听器的最大数量、新增和移除监听器时的钩子函数等。通过 setMaxListeners() 方法可以调整每个事件可以有的监听器的最大数量,默认值为 10。这个限制是为了防止内存泄漏。如果你确信需要更多的监听器,可以适当增加这个限制。同时,eventEmitter 实例会在添加或移除监听器时触发 newListenerremoveListener 事件,允许开发者在监听器变动时执行额外的逻辑。


总结

eventEmitter 是 Node.js 中实现事件驱动架构的基石。通过提供灵活的接口来注册、触发和移除事件监听器,它使得构建高效、可维护的 Node.js 应用成为可能。深入理解 eventEmitter 的工作原理和使用方法,对于任何希望掌握 Node.js 的开发者来说都是至关重要的。


以上介绍提供了对 eventEmitter 的全面理解,从基本概念到高级特性,从使用示例到最佳实践。虽然 eventEmitter 只是 Node.js 众多特性中的一个,但它在 Node.js 应用程序中扮演着核心角色。掌握了 eventEmitter,你就更接近成为 Node.js 开发的高手。

相关文章
|
3天前
|
Web App开发 JavaScript
vue报错【解决方案】 [Violation] Added non-passive event listener to a scroll-blocking <some> event.
vue报错【解决方案】 [Violation] Added non-passive event listener to a scroll-blocking <some> event.
8 0
|
2月前
|
JavaScript 开发者
vue解决报错Unable to preventDefault inside passive event listener invocation.
vue解决报错Unable to preventDefault inside passive event listener invocation.
138 0
|
2月前
|
前端开发 JavaScript 数据安全/隐私保护
ES6 什么是Proxy?什么是Promise?
ES6 什么是Proxy?什么是Promise?
43 0
|
10月前
|
JavaScript 测试技术 调度
使用 Ngrx ActionSubject 监听 Dispatched NgRx Actions
使用 Ngrx ActionSubject 监听 Dispatched NgRx Actions
|
11月前
throw new MongooseError(‘Mongoose.prototype.connect() no longer accepts a callback‘);
throw new MongooseError(‘Mongoose.prototype.connect() no longer accepts a callback‘);
104 1
|
11月前
|
数据采集 JavaScript 前端开发
对React SSR的理解(Server-Side-Rendering)
对React SSR的理解(Server-Side-Rendering)
|
JavaScript
js之call() apply() bind() $proxy()的总结
由以上代码可以总结出: 1. foo.call()与foo.apply()原理是一样的,将foo函数的this指向指定的对象(或者表述为在指定对象的上下文环境中运行foo函数); 2. bind(obj)与$proxy(obj)不同的是他们返回的是一个新的函数,该函数的this执行指定的对象obj。
129 0
js之call() apply() bind() $proxy()的总结
|
JavaScript 前端开发
js apply、call、bind一篇掌握
js apply、call、bind一篇掌握
js apply、call、bind一篇掌握
|
JavaScript
用Proxy给reactive套个娃会怎么样?
既然reactive是使用Proxy实现的,而且也可以套娃,那么我们自己定义一个Proxy套一下reactive会怎么样呢?
88 0
SAP Spartacus 4.0 deprecation 之一 - i18next-xhr-backend
SAP Spartacus 4.0 deprecation 之一 - i18next-xhr-backend
102 0
SAP Spartacus 4.0 deprecation 之一 - i18next-xhr-backend