返回只能接收事件但不发出的对象

时间:2015-12-14 17:34:47

标签: javascript node.js events closures eventemitter

如果这是重复的道歉,我在互联网上搜索了几个小时并且空了,所以我决定在这里发帖。

我正在为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")

当我运行它时,它不会触发它自己。 emit函数似乎被其他东西覆盖,但套接字对象仍然接收从某种方式发出的事件。

我希望我的解释是充分的。 提前谢谢!

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

1 个答案:

答案 0 :(得分:0)

我想我自己想出来了。

我将覆盖我使用自己的函数创建的新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);
}

这对我来说看起来不错,但如果有更好的方法可以做到这一点,那么我全心全意:)