2012-11-20 21 views
5

मैं घटनाओं का वारिस कैसे करूं। सिंगलटन डिज़ाइन पैटर्न को लागू करने वाले मॉड्यूल पर EventEmitter विधियां?नोडजेएस - सिंगलटन + घटनाक्रम

var EventEmitter = require('events').EventEmitter; 

var Singleton = {}; 
util.inherits(Singleton, EventEmitter); 

Singleton.createClient = function(options) { 
    this.url = options.url || null; 

    if(this.url === null) { 
     this.emit('error', 'Invalid url'); 
    } else { 
     this.emit('created', true); 
    } 
} 

module.exports = Singleton; 

यह त्रुटि में परिणाम है: TypeError: Object #<Object> has no method 'emit'

उत्तर

7

मैं अपने प्रश्न में सिंगलटन पैटर्न नहीं दिख रहा। क्या आपका मतलब इस तरह की किसी चीज से है?

var util = require("util") 
    , EventEmitter = process.EventEmitter 
    , instance; 

function Singleton() { 
    EventEmitter.call(this); 
} 

util.inherits(Singleton, EventEmitter); 

module.exports = { 
    // call it getInstance, createClient, whatever you're doing 
    getInstance: function() { 
    return instance || (instance = new Singleton()); 
    } 
}; 

यह इस्तेमाल किया जाएगा की तरह:

var Singleton = require('./singleton') 
    , a = Singleton.getInstance() 
    , b = Singleton.getInstance(); 

console.log(a === b) // yep, that's true 

a.on('foo', function(x) { console.log('foo', x); }); 

Singleton.getInstance().emit('foo', 'bar'); // prints "foo bar" 
+0

मेरे उदाहरण से फ़ंक्शन जोड़ने के लिए '' 'Singleton.prototype.createClient''' का उपयोग किया गया। App.js '' 'var S = आवश्यकता ('singleton.js') में। GetInstance(); S.createClient ({url: 'test'})। ('कनेक्टेड', फ़ंक्शन() {}); '' '' '' '' '' '' '' '' '' '' ''टाइप नहीं करता है' टाइप नहीं किया गया है, 'अपरिभाषित' पर 'विधि को कॉल नहीं कर सकता'' –

+0

कभी नहीं , काम करने के लिए चेनिंग के लिए 'स्वयं को वापस' '' '' '' '' '' '' '' '' '' '' '' '' ' –

5

मैं कक्षा emitter निम्नलिखित सिंगलटन घटना का उपयोग कर इस पुल में कामयाब रहे।

var emitter = require('<path_to_your_emitter>'); 

emitter.emit('myCustomEvent', arg1, arg2, ....) 
: http://code.google.com/p/jslibs/wiki/JavascriptTips#Singleton_pattern

var events = require('events'), 
    EventEmitter = events.EventEmitter; 

var emitter = function() { 
    if (arguments.callee._singletonInstance) 
     return arguments.callee._singletonInstance; 
    arguments.callee._singletonInstance = this; 
    EventEmitter.call(this); 
}; 

emitter.prototype.__proto__ = EventEmitter.prototype; 

module.exports = new emitter(); 

फिर आप निम्नलिखित

मॉड्यूल एक का उपयोग कर अपने मॉड्यूल में से किसी में घटना emitter पहुँच सकते हैं: arguments.callee._singletonInstance जावास्क्रिप्ट में एकमात्र ऐसा करने का पसंदीदा तरीका है

मॉड्यूल बी:

var emitter = require('<path_to_your_emitter>'); 

emitter.on('myCustomEvent', function(arg1, arg2, ...) { 
    . . . this will execute when the event is fired in module A 
}); 
1

यह ईएएस बनाने के ier, मैं एक NPM पैकेज बनाया है: central-event

आप क्या करना है पहले मॉड्यूल में है:

// Say Something 
 
var emitter = require('central-event'); 
 
emitter.emit('talk', 'hello world');

मॉड्यूल बी

// Say Something 
 
var emitter = require('central-event'); 
 
emitter.on('talk', function(value){ 
 
    console.log(value); 
 
    // This will pring hello world 
 
});