Topics Asynchronous Patterns EventEmitter & Custom Events
intermediate 14 min read

EventEmitter & Custom Events

Create and handle custom events using Node.js EventEmitter pattern.

EventEmitter

const EventEmitter = require('events');\n\nclass OrderSystem extends EventEmitter {\n  constructor() {\n    super();\n    this.orders = [];\n  }\n\n  placeOrder(items) {\n    const order = { id: this.orders.length + 1, items, status: 'pending' };\n    this.orders.push(order);\n    \n    this.emit('order:placed', order);\n    \n    setTimeout(() => {\n      order.status = 'confirmed';\n      this.emit('order:confirmed', order);\n    }, 1000);\n    \n    return order;\n  }\n}\n\nconst system = new OrderSystem();\n\n// Listen for events\nsystem.on('order:placed', (order) => {\n  console.log(`Order #${order.id} placed with ${order.items.length} items`);\n});\n\nsystem.on('order:confirmed', (order) => {\n  console.log(`Order #${order.id} confirmed!`);\n});\n\n// Handle errors\nprocess.on('uncaughtException', (err) => {\n  console.error('Uncaught:', err);\n  process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n  console.error('Unhandled Rejection:', reason);\n});

EventEmitter Methods

emitter.on(event, listener)       // Add listener\nemitter.once(event, listener)     // Listen once then remove\neventEmitter.emit(event, ...args) // Emit event\nemitter.removeListener(event, fn) // Remove listener\nemitter.removeAllListeners(event) // Remove all\nemitter.listeners(event)          // Get all listeners

Examples

const EventEmitter = require('events');

// Simple logger with events
class Logger extends EventEmitter {
  log(level, message) {
    const entry = {
      level,
      message,
      timestamp: new Date().toISOString(),
    };
    
    this.emit('log', entry);
    
    if (level === 'error') {
      this.emit('error', entry);
    }
  }

  info(msg) { this.log('info', msg); }
  warn(msg) { this.log('warn', msg); }
  error(msg) { this.log('error', msg); }
}

const logger = new Logger();

logger.on('error', (entry) => {
  console.error(`[${entry.timestamp}] ERROR: ${entry.message}`);
});

logger.on('log', (entry) => {
  console.log(`[${entry.timestamp}] ${entry.level.toUpperCase()}: ${entry.message}`);
});

logger.info('Application started');
logger.warn('Disk space low');
logger.error('Database connection failed');

Your Notes

Sign in to take notes for this lesson.

Quiz

Asynchronous Patterns Quiz

0 questions

Sign in to take quiz

Discussion

Sign in to join the discussion.

Flashcards

Sign in to create flashcards.