У меня есть приложение node.js с socket.io, которое я использую для выбора и загрузки различных внешних модулей (которые я называю «действия») в режиме реального времени.Убрать все прослушиватели событий, кроме определенных в 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.
}
}
Так, например, в этот пример, если я перехожу от someActivity.js
, я хотел бы удалить для всех клиентов слушателей «act1» и «act2», не удаляя их для «event1», «event2» и «changeActivity».
Любая идея о том, как это сделать?
Вы могли бы (а) сохранить список этих имен событий, слушая 'newListener' события или pssibly (б) получить слушатель для событий, которые вы хотите сохранить с' emitter.listeners() ' для событий, которые вы хотите сохранить, очистить все остальное и повторно подключить их (никогда не пробовал, может иметь побочные эффекты). – Wrikken
@Wrikken, похоже, нет события newListener или, по крайней мере, я не могу найти его в документах. У вас есть ссылка? Для вашего второго варианта, я думаю, мне нужно будет знать на сервере имя событий в модуле, вызывая нежелательную связь. – Sam
Ну, [эта страница говорит, что есть] (http://nodejs.org/api/events.html#events_event_newlistener). Согласно [этой странице] (http://nodejs.org/changelog.html) он существует с 2009.08.27 Версия 0.1.7. – Wrikken