首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS:“合并”两个EventEmitter,比如: eventemitter2 & HTTP Server

NodeJS:“合并”两个EventEmitter,比如: eventemitter2 & HTTP Server
EN

Stack Overflow用户
提问于 2016-01-13 07:32:00
回答 1查看 831关注 0票数 1

我是新来的,我有一个小问题:如何将一个EventEmitter与另一个“合并”或“扩展”?

我在命名空间中使用了EventEmitter2,现在我将把一个现有的EvenEmitter附加到一个命名空间。

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

我的函数如下所示:

代码语言:javascript
运行
复制
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 Server)发出一个请求、连接或其他任何东西时,来自EvenEmiter2的事件不会被激发。我是JavaScript / NodeJS的新手

目标是侦听和发出来自其他EventEmitter的事件,命名空间如下:

代码语言:javascript
运行
复制
dispatcher.on("http.request", function(req, res){
  res.end("test");
});

emit也是如此:

代码语言:javascript
运行
复制
dispatcher.emit("idontknow.event", "Param1", "ParamN...");

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-01-14 05:11:15

我找到了一个解决方案: Result: Works,但我对此并不满意。我可以避免来自"that.ignore“的语句检查吗?

代码语言:javascript
运行
复制
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)");

  }

};

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34755773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档