🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 事件 [Event Emitter 事件发射器](https://www.npmjs.com/package/@nestjs/event-emitter) 包(`@nestjs/event-emitter`)提供了一个简单的观察者实现,允许你订阅和监听在你应用中发生的不同事件。事件服务器是将应用程序的不同部分解耦的一个伟大的方法,因为一个事件可以被不同的监听者监听,且他们之间并不互相依赖。 `EventEmitterModule`在内部使用[eventmitter2](https://github.com/EventEmitter2/EventEmitter2)包。 ### 开始 首先安装依赖。 ```bash $ npm i --save @nestjs/event-emitter ``` 安装完成后,在`root`的`AppModule`中引入`EventEmitterModule`并且在`forRoot()`静态方法中运行: ```TypeScript import { Module } from '@nestjs/common'; import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ EventEmitterModule.forRoot() ], }) export class AppModule {} ``` `.forRoot()`调用与初始化事件发射器并注册应用程序中各个声明的事件监听器。注册发生在`onApplicationBootstrap`生命周期钩子开始的时候,以确保所有模块都已加载,所有定时任务已声明。 配置文件在`EventEmitter`实例中,在`forRoot()`方法中传递配置对象,如下: ```TypeScript EventEmitterModule.forRoot({ // set this to `true` to use wildcards wildcard: false, // the delimiter used to segment namespaces delimiter: '.', // set this to `true` if you want to emit the newListener event newListener: false, // set this to `true` if you want to emit the removeListener event removeListener: false, // the maximum amount of listeners that can be assigned to an event maxListeners: 10, // show event name in memory leak message when more than maximum amount of listeners is assigned verboseMemoryLeak: false, // disable throwing uncaughtException if an error event is emitted and it has no listeners ignoreErrors: false, }); ``` ### 分派事件 要分派一个事件(例如 `fire`), 使用标准构造函数注入`EventEmitter2`。 ```TypeScript constructor(private eventEmitter: EventEmitter2) {} ``` > `EventEmitter2` 从 `@nestjs/event-emitter` 包中导入。 然后在类中使用它: ```TypeScript this.eventEmitter.emit( 'order.created', new OrderCreatedEvent({ orderId: 1, payload: {}, }), ); ``` ### 监听事件 要声明一个事件监听器,用`@OnEvent()`装饰器装饰一个方法,装饰器在包含要执行代码的方法之前,如下: ```TypeScript @OnEvent('order.created') handleOrderCreatedEvent(payload: OrderCreatedEvent) { // handle and process "OrderCreatedEvent" event } ``` > 事件订阅器不能是请求范围的。 在简单的事件发射器中,第一个参数可以是`字符串`或者`符号`,在通配的事件发射器中,可以是`字符串|符号|数组<字符串|符号>`。第二个参数(可选的)是一个监听器的选项对象([参见这里](https://github.com/EventEmitter2/EventEmitter2#emitteronevent-listener-options-objectboolean))。 ```TypeScript @OnEvent('order.created', { async: true }) handleOrderCreatedEvent(payload: OrderCreatedEvent) { // handle and process "OrderCreatedEvent" event } ``` 要使用命名空间或者通配符,传递`wildcard`选项到`EventEmitterModule#forRoot()`方法中。当命名空间/通配符启用时,事件可以是句点隔开的(`foo.bar`)形式或者数组(`['foo','bar']`),句点也可以配置为一个配置属性(`delimiter`)。命名空间启用时,你可以使用通配符订阅事件。 ```TypeScript @OnEvent('order.*') handleOrderEvents(payload: OrderCreatedEvent | OrderRemovedEvent | OrderUpdatedEvent) { // handle and process an event } ``` 注意,这样的通配符仅对一个块有效。参数`order.*`将匹配例如`order.creted`和`order.shipped`事件,但不会匹配`order.delayed.out_of_stock`。要监听这样的事件,使用`多层通配符`模式(例如`**`)。见`EventEmitter2`[文档](https://github.com/EventEmitter2/EventEmitter2#multi-level-wildcards)。 ```TypeScript @OnEvent('**') handleEverything(payload: any) { // handle and process an event } ``` > `EventEmitter2`类提供了一些有用的方法来和事件交互,例如`waitFor`和`onAny`,参见[这里](https://github.com/EventEmitter2/EventEmitter2)。 ## 示例[#](#example) [此处](https://github.com/nestjs/nest/tree/master/sample/30-event-emitter)提供了一个工作示例。