【发布时间】:2013-04-28 23:22:31
【问题描述】:
我有带有 socket.io 的 node.js 应用程序,我用它来实时选择和加载不同的外部模块(我称之为“活动”)。
由于每个模块都将它自己的事件绑定到套接字,所以当我从一个模块更改为另一个模块时,我希望能够从我的套接字中删除前一个模块添加的所有事件侦听器。
我会使用emitter.removeAllListeners(),但这也会删除我在服务器中定义的事件,这是我不想要的。
我的代码如下所示:
app.js
// Boilerplate and some other code
var currentActivity;
io.sockets.on('connection', function(client){
client.on('event1', callback1);
client.on('event2', callback2);
client.on('changeActivity', function(activityPath){
var Activity = require(activityPath);
currentActivity = new Activity();
// Here I'd like some loop over all clients and:
// 1.- Remove all event listeners added by the previous activity
// 2.- Call currentActivity.bind(aClient) for each client
});
})
示例活动如下所示
someActivity.js
module.exports = function(){
// some logic and/or attributes
var bind = function(client){
client.on('act1' , function(params1){ // some logic
});
client.on('act2' , function(params2){ // some logic
});
// etc.
}
}
因此,例如在此示例中,如果我从 someActivity.js 更改为其他活动,我希望能够为所有客户端删除“act1”和“act2”的侦听器,而不删除那些对于“event1”、“event2”和“changeActivity”。
你知道如何做到这一点吗?
【问题讨论】:
-
您可以 (a) 通过侦听
newListener事件来保留这些事件名称的列表,或者可能 (b) 使用emitter.listeners()获取您想要保留的事件的侦听器您想要保留的事件,清除所有其他内容,然后重新附加它们(从未尝试过,可能有副作用)。 -
@Wrikken,似乎没有 newListener 事件,或者至少我在文档中找不到它。有链接吗?对于您的第二个选项,我想我需要在服务器中知道模块中事件的名称,从而导致不希望的耦合。
-
好吧,this page says there is。根据this page 的说法,它自 2009.08.27 版本 0.1.7 以来一直存在。
-
抱歉,我正在查看 Socket.io 文档。谢谢;)
标签: javascript node.js socket.io