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

Returning an object that can only receive events but not emit

抱歉,如果这是重复的,我在互联网上搜索了几个小时,结果一无所获,所以我决定 post 在这里。

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

基本上,我想要 return 一个对象,它接收事件并有一个名为 "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 函数似乎被其他东西覆盖,但 socket 对象仍然接收以某种方式从内部发出的事件。

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

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

我想我自己想出来了。

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

这对我来说看起来不错,但如果有更好的方法,那么我洗耳恭听:)