Socket.IO - 如何在客户端

时间:2015-09-30 21:19:37

标签: javascript node.js events socket.io

我想知道Node.js的 Socket.IO 客户端库中是否有用于替换特定事件的侦听器功能的选项。

我有这个简单的功能:

var Service = module.exports = function(address) {
    var _socket = require('socket.io-client')(address);

    this.connectAccount = function(account, callback) {
        _socket.on('account/connected', function (response) {
            callback(response.data, response.message);
        });

        _socket.emit('account/connect', account.getParameters());
    };
}

问题是,当我多次调用函数connectAccount()时,我每次在on()函数中传递的所有匿名函数也会被调用,并且在它达到限制并且抛出错误之后不久。

所以我的问题是,是否有一种方法如何在每次只调用一次时更换每次监听器?

提前致谢。

2 个答案:

答案 0 :(得分:5)

您可以在添加新侦听器之前删除侦听器,也可以检查是否附加了侦听器。

删除侦听器:

int count = 0;
for(int i = 0; i < n; i++) {
    for(int j = 1; j < n; j = j * 2) {
        count++;
    }
}

检查某个事件是否有听众:

_socker.removeListener('account/connected', [function]);

答案 1 :(得分:2)

eventEmitter支持多个事件处理程序。它没有“替换”事件处理程序的机制。因此,您有几个选择:

  1. 您可以为事件处理程序是否已设置保留一个标志。
  2. 您可以在添加之前删除侦听器。如果它尚未设置,则删除它只是一个noop。
  3. 仅安装事件处理程序一次的代码示例:

    var Service = module.exports = function(address) {
        var initialized = false;
        var _socket = require('socket.io-client')(address);
        this.connectAccount = function(account, callback) {
    
           if (!initialized) {
                _socket.on('account/connected', function (response) {
                    callback(response.data, response.message);
                });
                initialized = true;
            }
    
            _socket.emit('account/connect', account.getParameters());
        };
    }