6

シングルトンデザインパターンを実装するモジュールでevents.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'

4

3 に答える 3

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"
于 2012-11-20T04:12:33.653 に答える
5

次のシングルトンイベントエミッタークラスを使用して、これをうまくやってのけることができました。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
});
于 2013-02-07T05:31:59.307 に答える
2

簡単にするために、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
 });

于 2015-07-14T13:30:52.917 に答える