特定的人我有socket.io,我用它來選擇和加載不同的外部模塊實時(我稱之爲「活動」)的Node.js應用。刪除所有事件監聽器,除了在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.
}
}
因此,例如在這個例子,如果我從改變對其他一些活動,我希望能夠爲所有客戶端刪除「act1」和「act2」的偵聽器,而不刪除「event1」,「event2」和「changeActivity」的偵聽器。
有關如何完成此任何想法?
您可以(a)通過監聽'newListener'事件來保存這些事件名稱的列表,或者可以(b)使用'emitter.listeners()'獲取想要保留的事件的偵聽器'對於想要保留的事件,清除其他所有事件並重新附加它們(從未嘗試過,可能有副作用)。 – Wrikken 2013-04-23 21:46:53
@Wrikken,似乎沒有newListener事件,或者至少我在文檔中找不到它。有任何鏈接?對於第二種選擇,我想我需要在服務器中知道模塊中事件的名稱,導致不希望的耦合。 – Sam 2013-04-24 17:29:26
那麼,[這個網頁上說]有(http://nodejs.org/api/events.html#events_event_newlistener)。根據[本頁](http://nodejs.org/changelog.html),它自2009.08.27版本0.1.7開始一直存在。 – Wrikken 2013-04-24 17:34:37