2010-11-29 30 views
19

Prenons l'exemple stdin.on. Callbacks à stdin.on pile, donc si je vous écris (en CoffeeScript)Dissociation des événements dans Node.js

stdin = process.openStdin() 
stdin.setEncoding 'utf8' 
stdin.on 'data', (input) -> console.log 'One' 
stdin.on 'data', (input) -> console.log 'Two' 

alors chaque fois que je frappe le retour à l'invite, je reçois

One 
Two 

Ma question est, est-il possible de supprimer/remplacer un rappel une fois lié? Ou est la seule approche pour lier un rappel proxy et gérer l'état moi-même?

+0

Comment supprimer fonctions d'écoute en ligne? Comme 'server.on ('connect', function (pkt) {...});' – kBisla

Répondre

29

Vous pouvez utiliser removeListener(eventType, callback) pour supprimer un événement, ce qui devrait fonctionner avec tous les types d'émetteurs.

Exemple de l'API docs:

var callback = function(stream) { 
    console.log('someone connected!'); 
}; 
server.on('connection', callback); 
// ... 
server.removeListener('connection', callback); 

donc vous devez avoir une variable qui contient une référence à la fonction de rappel, car il est évident, il est par ailleurs impossible de dire quel rappel vous voulez avoir supprimé.

EDIT
devrait être quelqu'un comme ça dans CS:

stdin = process.openStdin() 
stdin.setEncoding 'utf8' 

logger = (input) -> console.log 'One' 
stdin.on 'data', logger 
stdin.removeListener 'data', logger 

stdin.on 'data', (input) -> console.log 'Two' 

Voir: http://nodejs.org/docs/latest/api/events.html#emitter.removeListener

+0

Merci, cela prend tout son sens! –

+1

Cela fonctionne bien, mais existe-t-il un moyen de supprimer les fonctions d'écoute en ligne? Comme 'server.on ('connect', fonction (pkt) {...});' – kBisla

15

Ou vous pouvez utiliser:

stdin.once au lieu de stdin.on