删除除Socket.io中特定事件之外的所有事件侦听器

时间:2013-04-23 21:33:07

标签: javascript node.js socket.io

我有一个带有socket.io的node.js应用程序,我用它来实时选择和加载不同的外部模块(我称之为#34;活动")。

由于每个模块都将自己的事件绑定到套接字,当我从一个模块更改为另一个模块时,我希望能够从我的套接字中删除上一个模块添加的所有事件监听器。

我会使用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"。

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

我会在每个模块中创建一个名为 unbind 的方法,删除 bind 函数添加的所有侦听器:

var fun1 = function(params1){ // some logic };    
var fun2 = function(params2){ // some logic };

module.exports = function(){    
    // some logic and/or attributes    
    var bind = function(client){    
        client.on('act1' , fun1);
        client.on('act2' , fun2);
    }

    var unbind = function(client){
        client.removeEventListener('act1',fun1);
        client.removeEventListener('act2',fun2);
    };
};

如果您需要访问侦听器中的客户端,我会重构它以将客户端传递给构造函数:

function MyModule(client){
   this.client = client;
};
MyModule.prototype.fun1 = function(params1){
   //do something with this.client
};
MyModule.prototype.fun2 = function(params2){
   //do something with this.client
};
MyModule.prototype.bind = function(){
   this.client.on('act1' , this.fun1);
   this.client.on('act2' , this.fun2);
};
MyModule.prototype.unbind = function(){
   this.client.removeEventListener('act1' , this.fun1);
   this.client.removeEventListener('act2' , this.fun2);
};
module.exports = MyModule;

然后你就可以使用它:

client.on('changeActivity', function(activityPath){
    var Activity = require(activityPath);
    var currentActivity = activityCache[activityPath] || new Activity(client); //use the existing activity or create if needed
    previousActivity.unbind();
    currentActivity.bind();
});