事件
事件组件是基于 eventemitter2 实现的,提供了强大的事件处理能力。
相关信息:
描述 | |
---|---|
可用于标准项目 | ✅ |
可用于 Serverless | ✅ |
可用于一体化 | ✅ |
包含独立主框架 | ❌ |
包含独立日志 | ❌ |
安装依赖
$ npm i @midwayjs/event-emitter@3 --save
或者在 package.json
中增加依赖后,重新安装
{
"dependencies": {
"@midwayjs/event-emitter": "^3.0.0"
}
}
使用组件
首先在 configuration.ts
中引入组件:
import { Configuration } from '@midwayjs/core';
import * as eventEmitter from '@midwayjs/event-emitter';
@Configuration({
imports: [
// ...
eventEmitter
]
})
export class MainConfiguration {
}
基础使用
定义事件监听器
警告
注意:@OnEvent()
装饰器只能用在单例(Singleton)类上。如果在非单例类上使用,事件监听器将无法正常工作。
使用 @OnEvent()
装饰器来定义事件监听器:
import { Provide, Singleton } from '@midwayjs/core';
import { OnEvent } from '@midwayjs/event-emitter';
@Provide()
@Singleton() // 必须使用 @Singleton 装饰器
export class UserService {
@OnEvent('user.created')
async handleUserCreated(user: any) {
console.log('新用户创建:', user);
}
}
发送事件
通过注入 EventEmitterService
来发送事件:
import { Inject } from '@midwayjs/core';
import { EventEmitterService } from '@midwayjs/event-emitter';
@Provide()
export class UserController {
@Inject()
eventEmitterService: EventEmitterService;
async createUser() {
const user = { id: 1, name: 'harry' };
// ... 创建用户逻辑
// 发送同步事件
this.eventEmitterService.emit('user.created', user);
// 或者发送异步事件
await this.eventEmitterService.emitAsync('user.created', user);
}
}
高级特性
事件监听器选项
@OnEvent()
装饰器支持多个配置选项,每个选项都有其特定的用途:
prependListener
用于控制监听器的执行顺序。设置为 true
时,会将监听器添加到监听器队列的开头,这样可以确保该监听器最先执行。
@Provide()
@Singleton()
export class UserService {
// 这个监听器会最先执行
@OnEvent('user.created', { prependListener: true })
async handleUserCreatedFirst(user: any) {
console.log('第一个处理用户创建事件');
}
// 这个监听器会在队列末尾执行
@OnEvent('user.created')
async handleUserCreated(user: any) {
console.log('后续处理用户创建事件');
}
}