JavaScript (Node.js) में Event Bus और Observer पैटर्न: उदाहरण सहित

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

JavaScript (Node.js) में Event Bus और Observer पैटर्न

आधुनिक Node.js डेवलपमेंट में अक्सर एप्लिकेशन के विभिन्न कंपोनेंट्स के बीच कमजोर रूप से जुड़ा (loosely coupled) इंटरैक्शन बनाने की ज़रूरत होती है। इस समस्या को हल करने के लिए Observer पैटर्न और इसका व्यावहारिक कार्यान्वयन Event Bus एकदम सही है। इस लेख में हम विस्तार से समझेंगे कि Event Bus क्या है, इसका Observer पैटर्न से क्या संबंध है, और Node.js के लिए शुद्ध JavaScript में अपनी खुद की Event Bus कैसे बनाएं।

Observer पैटर्न क्या है?

Observer पैटर्न ऑब्जेक्ट्स के बीच "एक-से-अनेक" (one-to-many) संबंध को परिभाषित करता है। जब एक ऑब्जेक्ट (Subject या Publisher) अपनी स्थिति बदलता है, तो उस पर निर्भर सभी ऑब्जेक्ट्स (Observers या Subscribers) को स्वचालित रूप से सूचित किया जाता है। Node.js में यह पैटर्न कोर में EventEmitter क्लास के माध्यम से बिल्ट-इन होता है।

पैटर्न के मुख्य घटक:

  • Subject (सब्जेक्ट) — वह ऑब्जेक्ट जो इवेंट जनरेट करता है।
  • Observer (ऑब्ज़र्वर) — वह ऑब्जेक्ट जो इवेंट को सब्सक्राइब करता है।
  • Subscription (सब्सक्रिप्शन) — ऑब्ज़र्वर को सब्जेक्ट पर रजिस्टर करने की प्रक्रिया।

Event Bus क्या है?

Event Bus एक केंद्रीकृत मध्यस्थ (centralized mediator) है जो Observer पैटर्न को लागू करता है। हर कंपोनेंट को सीधे दूसरे कंपोनेंट पर सब्सक्राइब करने के बजाय, सभी एक ही इवेंट बस के माध्यम से संवाद करते हैं। इसके निम्नलिखित फायदे हैं:

  • कंपोनेंट्स के बीच कमजोर कपलिंग (loose coupling)।
  • पब्लिशर के कोड को बदले बिना नए सब्सक्राइबर जोड़ने में आसानी।
  • इवेंट्स का केंद्रीकृत प्रबंधन (लॉगिंग, फ़िल्टरिंग, डीबगिंग)।

Node.js में बिल्ट-इन EventEmitter

Node.js में events नामक एक बिल्ट-इन मॉड्यूल है जिसमें EventEmitter क्लास शामिल है। यह Event Bus का तैयार कार्यान्वयन है। आइए एक बुनियादी उदाहरण देखें:

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

// 'user:login' इवेंट को सब्सक्राइब करें
eventBus.on('user:login', (user) => {
    console.log(`उपयोगकर्ता ${user.name} ने सिस्टम में लॉगिन किया`);
});

// एक और हैंडलर से सब्सक्राइब करें
eventBus.on('user:login', (user) => {
    console.log(`${user.email} के लिए स्वागत ईमेल भेजा जा रहा है`);
});

// इवेंट जनरेट करें
eventBus.emit('user:login', { name: 'राहुल', email: 'rahul@example.com' });
// आउटपुट:
// उपयोगकर्ता राहुल ने सिस्टम में लॉगिन किया
// rahul@example.com के लिए स्वागत ईमेल भेजा जा रहा है

खुद का Event Bus बनाना

कभी-कभी बिल्ट-इन EventEmitter पर्याप्त नहीं होता — उदाहरण के लिए, अगर आपको एसिंक्रोनस हैंडलर, प्राथमिकताएँ या सख्त टाइपिंग जोड़नी हो। आइए शुरू से अपना खुद का Event Bus बनाएं:

class EventBus {
    constructor() {
        this.events = {};
    }

    // इवेंट पर सब्सक्राइब करें
    on(eventName, callback) {
        if (!this.events[eventName]) {
            this.events[eventName] = [];
        }
        this.events[eventName].push(callback);
        
        // अनसब्सक्राइब करने के लिए फंक्शन लौटाएं
        return () => {
            this.events[eventName] = this.events[eventName]
                .filter(cb => cb !== callback);
        };
    }

    // एक बार के इवेंट पर सब्सक्राइब करें
    once(eventName, callback) {
        const wrapper = (...args) => {
            callback(...args);
            this.off(eventName, wrapper);
        };
        this.on(eventName, wrapper);
    }

    // इवेंट जनरेट करें
    emit(eventName, ...args) {
        const callbacks = this.events[eventName];
        if (!callbacks) return false;
        
        callbacks.forEach(callback => {
            try {
                callback(...args);
            } catch (error) {
                console.error(`इवेंट ${eventName} के हैंडलर में त्रुटि:`, error);
            }
        });
        return true;
    }

    // इवेंट से अनसब्सक्राइब करें
    off(eventName, callback) {
        if (!this.events[eventName]) return;
        this.events[eventName] = this.events[eventName]
            .filter(cb => cb !== callback);
    }
}                    

अनुशंसाएँ