我有一个基本的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吗?
答案 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);
}
}));
或类似的东西(发出一个你只订阅它的特殊事件)。