8

現在、別のオブジェクトをリッスンする必要があるオブジェクトがあるという問題があります。

問題は、サブスクリプションをどのように処理すればよいかということです。現在、私は2つの可能な方法しか知りません:

登録者の場合:

var Registrator = function() {
    this.listener = new Listener();
};

Registrator.prototype.register = function(subsriber) {
    var self = this;
    subscriber.on('event', function(info) {
        self.listener.doSomething(info);
    });

};

コンストラクターで:

var Subscriber = function() {
    var listener = require('./instanced-listener');
    this.on('event', function(info) {
        listener.doSomething(info);
    });

};

ご覧のとおり、どちらの方法もそれほどきちんとしたものではありません。この問題に使用できる別のパターンはありますか?

PS:

例が抽象的すぎるように見える場合は、ソースを次に示します。

https://github.com/bodokaiser/documents/blob/master/lib/repository.js

コンストラクターをチェックして、私の不幸を確認してください:)

4

2 に答える 2

2

編集

あなたのコメントによると、これについて何が読めないのかわかりませんが、StreamオブジェクトとエレガントなStream#pipe方法を試すことができます。

ストリーム

var Stream = require('stream').Stream;
var util = require('util');

var Sender = function() {
  this.readable = true;
  this.saySomething = function(message) {
    this.emit('data', message);
  };
};
util.inherits(Sender, Stream);

var Receiver = function() {
  this.writable = true;
  this.write = function(message) {
    console.log('received: ' + message);
  }
};
util.inherits(Receiver, Stream);

使用法

// instance of each
var s = new Sender();
var r = new Receiver();

// connect using pipe!
s.pipe(r);

// an event
s.saySomething('hello world'); //=> received: hello world

私は特にStreamオブジェクトを使用するのが好きです。このpipe方法は非常に便利です:) 各ストリームには単一の入力と出力があります。特定のタスクを担当する小さくて機能的なコンポーネントを構築することを奨励するので、私はそれらが好きです. その後、必要に応じてチェーン/再利用できます。


元の投稿

使いたくなるEventEmitter

ここに簡単な例があります

var events = require('events');
var util = require('util');

var SampleEmitter = function() {
    events.EventEmitter.call(this);

    this.sayHello = function() {
      this.emit('hello', 'hello world');
    };
};
util.inherits(SampleEmitter, events.EventEmitter);

var SampleListener = function(emitter) {
    emitter.on('hello', function(data) {
        console.log(data);
    });
};

var se = new SampleEmitter();
var sl = new SampleListener(se);

se.sayHello(); //=> 'hello world'
于 2012-12-24T11:34:15.193 に答える