2016-01-12 22 views
1

我是新的在这里,我有一个litle问题: 我怎样才能“合并”或“扩展”一个EventEmitter与另一个?NodeJS:“合并”两个EventEmitter,如:eventemitter2和HTTP服务器

我使用EventEmitter2使用命名空间,现在我将附加一个存在EvenEmitter到命名空间。

示例:dispatcher.attach(“namespace”,ee);

我对这个功能看起来像这样:

Dispatcher.prototype.attach = function(namespace, emitter) { 
 

 
    var that = this; 
 
    if (namespace && (typeof(emitter) === "object" && emitter._events)) { 
 

 
     //console.log("Attach EventEmitter, Namespace: '%s'", namespace); 
 
     Object.keys(emitter._events).forEach(function(event) { 
 

 
     var eventname = namespace + that.delimiter + event; 
 
     var listener = emitter._events[event]; 
 

 
     // add single function 
 
     if (typeof(listener) === "function") { 
 

 
      var func = listener.bind(emitter); 
 
      that.on(eventname, func); 
 

 
     } 
 

 

 
     // add multiple functions 
 
     if (typeof(listener) === "object") { 
 
      for (var i = 0; i < listener.length; i++) { 
 

 
      var func = listener[i].bind(emitter); 
 
      that.on(eventname, func); 
 

 
      } 
 
     } 
 

 
    emitter.on(event, function(){ 
 

 
    console.log(eventname, "=", event); 
 

 
    var parameter = []; 
 
    parameter.push(eventname); 
 
    parameter.push(arguments); 
 

 
    that.emit.apply(this, parameter); 
 

 

 
    }); 
 

 

 

 

 
     }); 
 

 

 
     console.log(that.listenerTree); 
 

 
    } else { 
 
     throw new Error("Wrong parameter: dispatcher.attach('namespace', emitter)"); 
 
    }

让我解释一下:

问题是,当发射器(如例如HTTP服务器),发出一个请求,连接器或者甚至从EvenEmiter2发出的事件都不会被解雇。我于JavaScript/

的NodeJS

新的目标是听&发出其他EventEmitter事件在命名空间是这样的:

dispatcher.on("http.request", function(req, res){ 
    res.end("test"); 
}); 

相同的EMIT:

dispatcher.emit("idontknow.event", "Param1", "ParamN..."); 

谢谢!

回答

0

我找到了一个解决方案: 结果:工程,但我不满意。 我可以避免从“that.ignore”的语句检查吗?

Dispatcher.prototype.attach = function(namespace, emitter) { 
 

 
    var that = this; 
 
    this.ignore = false; 
 

 
    console.log("Attach; Namespace: %s", namespace); 
 
    if (namespace && typeof(namespace) === "string" && (typeof(emitter) === "object" && emitter._events)) { 
 
    Object.keys(emitter._events).forEach(function(event) { 
 

 
     // namespace + event 
 
     var eventname = namespace + that.delimiter + event; 
 

 
     // Listen for Dispatcher events, then emit "sub" event 
 
     // dispatcher.on("namespace.<event>") -> emitter.emit("<event>"); 
 
     that.on(eventname, function() { 
 

 
     if (that.ignore === false || that.ignoreOff === true) { 
 
      that.ignore = true; 
 
      var parameter = []; 
 
      parameter = Array.prototype.slice.call(arguments); 
 
      parameter.unshift(event); 
 
      emitter.emit.apply(emitter, parameter); 
 
      that.ignore = false; 
 
     } 
 

 
     }); 
 

 
     // Listen for "sub" Emitter events, then emit dispatcher 
 
     // emitter.on("<event>") -> dispatcher.emit("namespace.<event>") 
 
     emitter.on(event, function() { 
 

 
     if (that.ignore === false || that.ignoreOff === true) { 
 
      that.ignore = true; 
 
      var parameter = []; 
 
      parameter = Array.prototype.slice.call(arguments); 
 
      parameter.unshift(eventname); 
 
      that.emit.apply(that, parameter); 
 
      that.ignore = false; 
 
     } 
 

 
     }); 
 

 
    }); 
 
    } else { 
 

 
    // wrong parameter... 
 
    throw new Error("Wrong parameter: dispatcher.attach('namespace', ee)"); 
 

 
    } 
 

 
};