【问题标题】:Returning an object that can only receive events but not emit返回一个只能接收事件但不能发射的对象
【发布时间】:2016-03-20 07:07:57
【问题描述】:

抱歉,如果这是重复的,我在互联网上搜索了几个小时并没有任何结果,所以我决定在这里发帖。

我正在为 node.js 开发一个必须处理套接字连接的模块。我想创建一个函数,该函数将一个对象返回给用户,然后该对象将接收用户可以设置监听器的事件。但是,我想以某种方式做到这一点,以便用户无法在该对象上发出事件。相反,我希望我的事件发射器中的 emit 函数被我自己的函数覆盖。

基本上,我想返回一个对象,它接收事件并有一个名为“emit”的函数,其作用类似于任何常规函数。

这是我想到的一个小例子:

var events = require('events');

var out = (function(){
  var obj = new events.EventEmitter();

  // I used nextTick to emulate the asyncrounes nature of the socket server
  process.nextTick(function(){

    obj.emit('Message', "Dummy socket message") // This will be triggered when a message is sent to the socket server
  })

  return obj;
})();


out.on('Message', function(msg){
  console.log(msg)
  out.emit("newWork", "New instructions")
  // Im trying to make it work so that this would not throw the event emitter into an infinite loop
});

现在,在 out.on("Message", function... 部分中,我希望用户能够编写 out.emit("dummy", "dummy data") 并能够调用我自己的 emit 函数,该函数对提供的输入执行某些操作。

我该怎么做呢?

我知道它一定是可能的,因为 socket.io 正是这样做的。 这是socket.io的一小段代码

socket.on('test', function(){
  console.log("called!")
})

socket.emit("test")

当我运行它时,它不会自行触发。发射函数似乎被其他东西覆盖了,但套接字对象仍然接收从内部发出的事件。

我希望我的解释是足够的。 提前致谢!

编辑:我知道使用(function() { ... })() 不是创建模块的方法。我在这里使用只是为了更容易说明,因为这种方法的概念保持不变

【问题讨论】:

    标签: javascript node.js events closures eventemitter


    【解决方案1】:

    我想是我自己想出来的。

    我将覆盖我用自己的函数创建的新 EventEmitter 实例中的 emit 函数,并改用 EventEmitter.prototype 中的那个。这样我就可以使用自定义的发出函数将我的对象发回给用户,同时仍然能够从我的模块中对该对象发出事件

    这是我在尝试解决这个问题时编写的一个小演示。

    var events = require('events').EventEmitter;
    obj = new events();
    
    obj.emit = function(name, data){
      console.log("Received: name - " + name + "; data - " + data);
    }
    
    function emitOnObj(obj, name, msg){
      events.prototype.emit.call(obj, name, msg);
    }
    

    这对我来说看起来不错,但如果有更好的方法来做到这一点,那么我会全神贯注:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多