Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js将事件处理程序附加到新_Javascript_Events_Node.js_Javascript Events_Event Handling - Fatal编程技术网

Javascript Node.js将事件处理程序附加到新

Javascript Node.js将事件处理程序附加到新,javascript,events,node.js,javascript-events,event-handling,Javascript,Events,Node.js,Javascript Events,Event Handling,在基于Node.js的项目中,我有两个对象: EmitterA EmitterB 消费者 在消费者的构造函数中,我有以下内容: var a = new EmitterA(); a.on('someEvent', someEventHandler); var self = this; var b = new EmitterB(); b.on('someEventFromB', function() { self.emit('someEvent'); }); 在EmitterA的构造

在基于Node.js的项目中,我有两个对象:

  • EmitterA
  • EmitterB
  • 消费者
在消费者的构造函数中,我有以下内容:

var a = new EmitterA();
a.on('someEvent', someEventHandler);
var self = this;
var b = new EmitterB();
b.on('someEventFromB', function() {
    self.emit('someEvent');
});
在EmitterA的构造函数中,我有以下内容:

var a = new EmitterA();
a.on('someEvent', someEventHandler);
var self = this;
var b = new EmitterB();
b.on('someEventFromB', function() {
    self.emit('someEvent');
});
最后,在EmitterB的构造函数中,我有如下内容:

this.emit('someEventFromB');
问题在于,当从
EmitterB
启动inital
.emit()
时,消费者的
someEventHandler()
不会被触发。原因之一是时机<代码>消费者不会订阅
EmitterA
上的
someEvent
,直到事件触发后

是否有一种在构建时附加事件处理程序的方法?我考虑过使用,但在以后处理多个侦听器时,以及在有许多不同类型的事件将被触发的情况下,这将是一个问题。如果可能的话,我想避开这条路线,我正在寻找你可能建议的替代方案。谢谢

试试以下方法:

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
}

我只是想到了一种对我的具体情况有效的替代方法,但对其他人可能会有问题。请加一粒盐使用

EmitterB
的构造函数中,我更改了
this.emit('someEventFromB')到此:

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

另请参见:

Ha,是的,这很有效。我不知道为什么我一开始没有想到这一点。谢谢