0

Node.jsベースのプロジェクトには、いくつかのオブジェクトがあります。

  • EmitterA
  • EmitterB
  • Consumer

のコンストラクターにはConsumer、次のものがあります。

var a = new EmitterA();
a.on('someEvent', someEventHandler);

のコンストラクターにはEmitterA、次のものがあります。

var self = this;
var b = new EmitterB();
b.on('someEventFromB', function() {
    self.emit('someEvent');
});

最後に、EmitterBのコンストラクターには、次のようなものがあります。

this.emit('someEventFromB');

問題は、最初のfromが起動されたときにConsumer'ssomeEventHandler()が起動されないことです。その理由はタイミングの1つです。 イベントが発生するまでサブスクライブしません。.emit()EmitterBConsumersomeEventEmitterA

構築時にイベントハンドラーをアタッチする方法はありますか?newListenerイベント の利用を検討しましたが、後で複数のリスナーを操作する場合や、さまざまな種類のイベントが発生する場合は問題になります。可能であればこのルートを避けたいので、あなたが提案できる代替案を探しています。ありがとう!

4

2 に答える 2

1

次のようなものを試してください:

var a = new EmitterA({
    events : {
        someEvent : someEventHandler
    }
});

function EmitterA( props ){
    props || ( props = {} );

    if( props.events ){
        for( var n in props.events ){
            this.on( n, props.events[n] );
        }
    }

    // the rest of the constructor code
}
于 2012-04-16T03:53:20.883 に答える
0

私は自分の特定のケースで機能する別の方法を考えましたが、他の人にとっては問題があるかもしれません。一粒の塩と一緒に使ってください。

EmitterBのコンストラクターで、次のように変更しthis.emit('someEventFromB');ました。

process.nextTick(function() {
    this.emit('someEventFromB');
}

参照: http: //howtonode.org/understanding-process-next-tick

于 2012-04-16T03:55:56.380 に答える