如果这是重复的道歉,我在互联网上搜索了几个小时并且空了,所以我决定在这里发帖。
我正在为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() { ... })()
不是创建模块的方法。我在这里使用只是为了更容易说明,因为这个方法的概念保持不变
答案 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);
}
这对我来说看起来不错,但如果有更好的方法可以做到这一点,那么我全心全意:)