2012-11-20 54 views
5

如何在實現單例設計模式的模塊上繼承events.EventEmitter方法?NodeJS - Singleton + Events

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

我沒有看到你的問題Singleton模式。你的意思是這樣嗎?

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 = require('singleton.js')。getInstance(); S.createClient({url:'test'})。on('connected',function(){});'''不起作用'''TypeError:無法調用未定義的'on'方法 –

+0

nevermind ,必須'''返回self'''鏈接工作:P thx! –

5

我設法退出這個功能使用發射器級以下單事件。 arguments.callee._singletonInstance是在JavaScript做單身人士的首選方式:

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(); 

您可以然後使用以下

單元三訪問您的任何模塊的事件發射器

MODULE B:

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

爲了使EAS IER,我創建了一個NPM包:central-event

,你所要做的是第一個模塊中:

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

模塊B

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