特定的人我有socket.io,我用它来选择和加载不同的外部模块实时(我称之为“活动”)的Node.js应用。删除所有事件监听器,除了在Socket.io
由于每个模块结合它自己的事件到插座,当我改变从一个模块到另一个我希望能够从我的插座删除所有的事件监听器,以前的模块添加。
我会用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.
}
}
因此,例如在这个例子,如果我从改变对其他一些活动,我希望能够为所有客户端删除“act1”和“act2”的侦听器,而不删除“event1”,“event2”和“changeActivity”的侦听器。
有关如何完成此任何想法?
您可以(a)通过监听'newListener'事件来保存这些事件名称的列表,或者可以(b)使用'emitter.listeners()'获取想要保留的事件的侦听器'对于想要保留的事件,清除其他所有事件并重新附加它们(从未尝试过,可能有副作用)。 – Wrikken 2013-04-23 21:46:53
@Wrikken,似乎没有newListener事件,或者至少我在文档中找不到它。有任何链接?对于第二种选择,我想我需要在服务器中知道模块中事件的名称,导致不希望的耦合。 – Sam 2013-04-24 17:29:26
那么,[这个网页上说]有(http://nodejs.org/api/events.html#events_event_newlistener)。根据[本页](http://nodejs.org/changelog.html),它自2009.08.27版本0.1.7开始一直存在。 – Wrikken 2013-04-24 17:34:37