Performance: Event patterns (event-based)
This concept affects how quickly the server responds to events and how efficiently it handles multiple event listeners without blocking the main thread.
import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; @EventsHandler(SomeEvent) export class SomeEventHandler implements IEventHandler<SomeEvent> { async handle(event: SomeEvent) { await new Promise(resolve => setImmediate(resolve)); // defer heavy work // heavy processing done asynchronously console.log('Event handled asynchronously'); } }
import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; @EventsHandler(SomeEvent) export class SomeEventHandler implements IEventHandler<SomeEvent> { handle(event: SomeEvent) { // heavy synchronous processing for (let i = 0; i < 1000000000; i++) {} console.log('Event handled'); } }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Synchronous event handlers with heavy work | N/A | N/A | N/A | [X] Bad |
| Asynchronous event handlers with deferred work | N/A | N/A | N/A | [OK] Good |
@EventPattern in a NestJS application?@EventPattern@EventPattern listens to events [OK]@Payload() extracts the data sent with the event.@Body(), @Query(), and @Param() are used in HTTP controllers, not event handlers.@Payload() decorator on a method parameter -> Option A@Payload() gets event data [OK]@EventPattern('order_created')
handleOrder(@Payload() data: any) {
console.log(`Order ID: ${data.id}`);
}id: 42, so data.id is 42 and will be logged.@EventPattern('user_registered')
handleUser(@Payload data: any) {
console.log(data.username);
}@Payload decorator requires parentheses even if no arguments are passed, so it should be @Payload().@Payload() needs parentheses [OK]@EventPattern specifying the event name.Pass the test and this pattern moves unknown