暂时禁用事件侦听器并稍后重新绑定

时间:2015-08-21 20:10:46

标签: javascript node.js events javascript-events

我有一个基本的websocket程序。我有一个数据回调,它分析消息并发出一个事件。这是一个显示需要显示的所有内容的最小示例。

Cylon = new EventEmitter();

Cylon._createConnection = function(name) {
  let self = this;
  let socket = net.connect(this.config.port, this.config.host);

  socket.on('data', Meteor.bindEnvironment(function (data) {
    let args = _.compact(data.toString('ascii').split(':'));
    args.push(name);
    self.emit.apply(self, args);
  }));

  return socket;
}

Cylon._commands = Cylon._createConnection('commands');

Cylon.on('TriggerActivated', (trigger) => {
  console.log(`Trigger warning! ${trigger}`);
});

问题在于:存在一个echo命令,它只是将信息作为字符串传递给套接字。这意味着可以通过Cylon.on('TriggerActivated')

欺骗MG "TriggerActivated:test"

所以我的问题是:有没有办法暂时取消绑定所有事件监听器?

Cylon._sendCommand = function (command) {
  check(command, String);
  if (command.splice(0,2) === 'MG') {
   // Unbind event listeners
   Cylon._commands.on('data', console.log);
   Cylon._commands.write(command);
   // Rebind all previous event listeners here
  }
}

这可以用javascript / node吗?

1 个答案:

答案 0 :(得分:1)

你可以这样做(未经测试):

// get current listeners
var listeners = Cylon.listeners(command)

// Unbind event listeners
Cylon.removeAllListeners(command);

// do your special processing
Cylon._commands.on('data', console.log);
Cylon._commands.write(command);

// Rebind all previous event listeners here
listeners.forEach(function(listener) {
    Cylon.on(command, listener);
};

但最好不要发出事件:

  socket.on('data', Meteor.bindEnvironment(function (data) {
    if (data.splice(0,2) !== 'MG') {
        let args = _.compact(data.toString('ascii').split(':'));
        args.push(name);
        self.emit.apply(self, args);
    } else {
        console.log(data);
    }
  }));

或类似的东西(发出一个你只订阅它的特殊事件)。