EventEmitter ma’lumotnomasi


ULASHISH

EventEmitter obyekti

EventEmitter - bu Node.js-dagi obyektlar orasidagi aloqani osonlashtiradigan modul. U Node asinxron hodisalarga asoslangan arxitekturasining asosini tashkil etadi.

Node-ning o‘rnatilgan modullarining aksariyati EventEmitter-dan, jumladan HTTP serverlari, oqimlari va boshqalarni meros qilib oladi.

EventEmitterni import qilish

// Method 1: Using require
const EventEmitter = require('events');

// Method 2: ES6 destructuring
const { EventEmitter } = require('events');

EventEmitter yaratish

const EventEmitter = require('events');

// Create a new EventEmitter instance
const myEmitter = new EventEmitter();

// Create a class that extends EventEmitter
class MyEmitter extends EventEmitter {
  constructor() {
    super();
  }
}

// Instantiate the extended class
const myExtendedEmitter = new MyEmitter();

EventEmitter usullari

Metod Tavsif
addListener(event, listener) Belgilangan hodisa uchun tinglovchilar massivining oxiriga tinglovchini qo‘shadi. on() uchun taxallus.
emit(event, [arg1], [arg2], ...) Voqea uchun ro‘yxatdan o‘tgan tinglovchilarning har birini ro‘yxatga olingan tartibda sinxron ravishda chaqiradi va taqdim etilgan dalillarni har biriga uzatadi.
eventNames() Emitent tinglovchilarni ro‘yxatdan o‘tkazgan voqealar ro‘yxatini qaytaradi.
getMaxListeners() EventEmitter uchun joriy maksimal tinglovchi qiymatini qaytaradi, emitter.setMaxListeners(n) tomonidan o‘rnatilgan yoki birlamchi EventEmitter.defaultMaxListeners .
listenerCount(event) Belgilangan hodisani tinglayotgan tinglovchilar sonini qaytaradi.
listeners(event) Belgilangan hodisa uchun tinglovchilar massivining nusxasini qaytaradi.
off(event, listener) Alias for removeListener().
on(event, listener) Belgilangan hodisa uchun tinglovchilar massivining oxiriga tinglovchini qo‘shadi.
once(event, listener) Bir marta ishga tushirilgandan keyin olib tashlanadigan voqea uchun bir martalik tinglovchini qo‘shadi.
prependListener(event, listener) Belgilangan hodisa uchun tinglovchilar massivining boshiga tinglovchini qo‘shadi.
prependOnceListener(event, listener) Hodisa uchun bir martalik tinglovchini tinglovchilar massivining boshiga qo‘shadi, u bir marta ishga tushirilgandan keyin olib tashlanadi.
removeAllListeners([event]) Barcha tinglovchilarni yoki belgilangan hodisani olib tashlaydi.
removeListener(event, listener) Belgilangan tinglovchini belgilangan hodisa uchun tinglovchilar massividan olib tashlaydi.
setMaxListeners(n) EventEmitter misoliga qo‘shilishi mumkin bo‘lgan tinglovchilarning maksimal sonini belgilaydi.
rawListeners(event) Belgilangan hodisa uchun tinglovchilar (listener) massivining nusxasini, har qanday o‘ramlar (masalan, once() yaratganlari) bilan birga qaytaradi.


EventEmitter xususiyatlari

Xususiyat Tavsif
EventEmitter.defaultMaxListeners Barcha EventEmitter misollari uchun standart maksimal tinglovchilar sonini o‘rnatadi. Standart 10.
emitter.errorMonitor Faqat "xato" hodisalarini kuzatish uchun tinglovchini o‘rnatish uchun ishlatilishi mumkin bo‘lgan statik belgi.
emitter.captureRejections To‘g‘ri bo‘lsa, Promiselarni rad etishlar ushlanib, "xato" hodisalari sifatida chiqariladi.

EventEmitterdan asosiy foydalanish

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Register an event listener
myEmitter.on('event', () => {
  console.log('An event occurred!');
});

// Emit the event
myEmitter.emit('event');
O‘zingiz sinab ko‘ring »

Argumentlarni tinglovchilarga etkazish

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Event with multiple arguments
myEmitter.on('status', (code, message) => {
  console.log(`Got status: ${code} ${message}`);
});

// Emit with arguments
myEmitter.emit('status', 200, 'OK');
O‘zingiz sinab ko‘ring »

Bir martalik Tadbir tinglovchilari

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Add one-time listener
myEmitter.once('onetime', () => {
  console.log('This will be called only once');
});

// First emit - will trigger the listener
myEmitter.emit('onetime');

// Second emit - won't trigger the listener
myEmitter.emit('onetime');
O‘zingiz sinab ko‘ring »

Xato hodisalari

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Error event handler
myEmitter.on('error', (err) => {
  console.error('Error occurred:', err.message);
});

// Emit an error event
myEmitter.emit('error', new Error('Something went wrong'));

// If no 'error' listener is added, Node will throw and crash
// Always add an error handler!
O‘zingiz sinab ko‘ring »

Tadbir nomlari va tinglovchilarni olish

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Add some listeners
myEmitter.on('event1', () => console.log('Event 1'));
myEmitter.on('event2', () => console.log('Event 2'));
myEmitter.on('event2', () => console.log('Event 2 again'));

// Get all event names
console.log('Event names:', myEmitter.eventNames());

// Get listeners for a specific event
console.log('Listeners for event2:', myEmitter.listeners('event2'));

// Count listeners
console.log('Listener count for event2:', myEmitter.listenerCount('event2'));
O‘zingiz sinab ko‘ring »

Tinglovchilarni olib tashlash

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Define listener function (needed for removal)
function listener1() {
  console.log('Listener 1 executed');
}

function listener2() {
  console.log('Listener 2 executed');
}


// Add listeners
myEmitter.on('event', listener1);
myEmitter.on('event', listener2);

console.log('Listeners before removal:', myEmitter.listenerCount('event'));

// Remove a specific listener
myEmitter.removeListener('event', listener1);
// or using the alias: myEmitter.off('event', listener1);

console.log('Listeners after removal:', myEmitter.listenerCount('event'));

// Remove all listeners for an event
myEmitter.removeAllListeners('event');

console.log('Listeners after removeAll:', myEmitter.listenerCount('event'));
O‘zingiz sinab ko‘ring »

Maksimal tinglovchilarni sozlash

const EventEmitter = require('events');

// Set the default max listeners for all EventEmitter instances
EventEmitter.defaultMaxListeners = 15;

const myEmitter = new EventEmitter();

// Set max listeners for a specific instance
myEmitter.setMaxListeners(20);

console.log('Default max listeners:', EventEmitter.defaultMaxListeners);
console.log('myEmitter max listeners:', myEmitter.getMaxListeners());

// Adding more than maxListeners will trigger a warning
// The warning helps identify potential memory leaks
O‘zingiz sinab ko‘ring »

Tinglovchilar tartibi

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Default behavior: listeners execute in order they were added
myEmitter.on('event', () => console.log('First listener'));
myEmitter.on('event', () => console.log('Second listener'));

// Prepend a listener (it will execute first)
myEmitter.prependListener('event', () => console.log('Prepended listener'));

// One-time prepended listener
myEmitter.prependOnceListener('event', () => console.log('Prepended once listener'));


// Emit the event
myEmitter.emit('event');

// Output will be:
// Prepended once listener
// Prepended listener
// First listener
// Second listener
O‘zingiz sinab ko‘ring »

EventEmitter kengaytirilmoqda

Node.js’da keng tarqalgan namuna bu EventEmitter-ni kengaytiruvchi class yaratish va maxsus funksiyalarni qo‘shishdir:

const EventEmitter = require('events');

// Custom class that extends EventEmitter
class MyApp extends EventEmitter {
  constructor() {
    super();
    this.name = 'MyApp';
  }

  process(data) {
    // Do some processing
    console.log(`Processing data: ${data}`);
    
    // Emit events based on processing results
    if (data.length > 10) {
      this.emit('large-data', data);
    } else {
      this.emit('small-data', data);
    }
    
    // Emit completion event
    this.emit('processed', data);
  }
}

// Create an instance
const app = new MyApp();

// Register event listeners
app.on('large-data', (data) => {
  console.log(`Large data detected: ${data.length} bytes`);
});

app.on('small-data', (data) => {
  console.log(`Small data detected: ${data.length} bytes`);
});

app.on('processed', (data) => {
  console.log('Processing completed');
});

// Use the app
app.process('Hello');
app.process('Hello, this is a longer string of data');
O‘zingiz sinab ko‘ring »

Asinxron va sinxron

EventEmitter barcha tinglovchilarni ro‘yxatdan o‘tgan tartibda sinxron ravishda chaqiradi. Kutilayotgan ijro tartibini saqlash uchun muhim:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Register listener
myEmitter.on('event', () => {
  console.log('Listener executed');
});

// Emit event
console.log('Before emit');
myEmitter.emit('event');
console.log('After emit');

// Output:
// Before emit
// Listener executed
// After emit
O‘zingiz sinab ko‘ring »

Tinglovchilarni asinxron tarzda ishga tushirish uchun siz setImmediate() yoki process.nextTick() dan foydalanishingiz mumkin:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Register async listener using setImmediate
myEmitter.on('async-event', () => {
  setImmediate(() => {
    console.log('Async listener executed');
  });
});

console.log('Before emit');
myEmitter.emit('async-event');
console.log('After emit');

// Output:
// Before emit
// After emit
// Async listener executed
O‘zingiz sinab ko‘ring »

Integratsiyani Promise qilish

Zamonaviy Node.js versiyalarida EventEmitter Promiselarni bajara oladi va rad etishlarni oladi:

const EventEmitter = require('events');

// Enable capture rejections (Node.js 12.16.0+)
const myEmitter = new EventEmitter({ captureRejections: true });

// OR set it globally
// EventEmitter.captureRejections = true;

// Event handler that returns a Promise
myEmitter.on('async-operation', async () => {
  // This rejected promise will be captured and converted to an 'error' event
  throw new Error('Async operation failed');
});

// Error handler
myEmitter.on('error', (err) => {
  console.error('Caught error:', err.message);
});

// Trigger the event
myEmitter.emit('async-operation');
Misolni ishga tushirish »

Haqiqiy misol: HTTP serveri

EventEmitter ko‘plab Node.js asosiy modullarini quvvatlantiradi. HTTP-server voqealardan qanday foydalanadi:

const http = require('http');

// HTTP Server is an EventEmitter
const server = http.createServer();

// Listen for 'request' events
server.on('request', (request, response) => {
  console.log(`Received ${request.method} request for ${request.url}`);
  response.writeHead(200, { 'Content-Type': 'text/plain' });
  response.end('Hello World\n');
});

// Listen for 'connection' events
server.on('connection', (socket) => {
  console.log('New client connection from', socket.remoteAddress);
});

// Listen for 'close' event
server.on('close', () => {
  console.log('Server closed');
});

// Listen on port 8080
server.listen(8080, () => {
  console.log('Server listening on port 8080');
});

// Later, we can close the server
// server.close();

Umumiy namunalar va eng yaxshi amaliyotlar

1. Har doim "xato" hodisalarini tinglang

Agar EventEmitter "xato" hodisasini chiqarsa va tinglovchilar bo‘lmasa, Node.js xatoni chiqaradi va jarayonni buzadi. Har doim xato ishlov beruvchilarini qo‘shing:

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

// Always add error handlers
myEmitter.on('error', (err) => {
  console.error('Error occurred:', err);
  // Handle the error appropriately
});

2. Xotira oqishini oldini olish uchun tinglovchilarni tozalash

const EventEmitter = require('events');
const myEmitter = new EventEmitter();

function setupHandler() {
  const handler = () => console.log('Event handled');
  
  // Add the handler
  myEmitter.on('some-event', handler);
  
  // Return a cleanup function
  return function cleanup() {
    myEmitter.removeListener('some-event', handler);
  };
}

// Set up a handler
const cleanup = setupHandler();

// Later, when no longer needed
cleanup();

3. Olinadigan tinglovchilar uchun nomli funksiyalardan foydalaning

// BAD - Cannot remove this listener later
emitter.on('event', () => console.log('Anonymous function'));

// GOOD - Can be removed by reference
function namedHandler() {
  console.log('Named function');
}

emitter.on('event', namedHandler);

// Later
emitter.removeListener('event', namedHandler);

W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!