【发布时间】: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