NodeJS – 单身+事件

我将如何inheritanceevents.EventEmitter方法实现单身devise模式的模块?

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'

我没有看到你的问题中的单身模式。 你的意思是这样吗?

 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" 

我设法把这个closures使用下面的单例事件发射器类。 arguments.callee._singletonInstance是在javascript中执行单例的首选方法: 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(); 

然后,您可以使用以下任一模块访问事件发射器

模块A:

 var emitter = require('<path_to_your_emitter>'); emitter.emit('myCustomEvent', arg1, arg2, ....) 

模块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 }); 

为了更容易,我创build了一个npm包: 中央事件

你必须做的是在第一个模块中:

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