2010-11-29 3 views
19

Nehmen wir stdin.on als ein Beispiel. Rückrufe stdin.on Stapel, also wenn ich (in Coffeescript) schreibenEreignisse in Node.js lösen

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

dann an der Eingabeaufforderung jedes Mal wenn ich Rückkehr getroffen, ich

One 
Two 

Meine Frage ist, gibt es eine Möglichkeit, zu entfernen/einen einmal gebundenen Callback ersetzen? Oder ist der einzige Ansatz, einen Proxy-Callback zu binden und den Status selbst zu verwalten?

+0

Wie entfernen Inline-Listener-Funktionen? Wie 'server.on ('connect', Funktion (pkt) {...});' – kBisla

Antwort

29

Sie können removeListener(eventType, callback) verwenden, um ein Ereignis zu entfernen, das mit allen Arten von Emittern funktionieren sollte.

Beispiel aus der API-Dokumentation:

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

Also brauchen Sie eine Variable, die einen Verweis auf die Callback hält, weil offensichtlich, es sonst unmöglich ist, das zu sagen, Rückruf Sie entfernt haben mögen.

EDIT
Sollte jemand so in CS sein:

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' 

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

+0

Danke, das macht Sinn! –

+1

Das funktioniert gut, aber gibt es eine Möglichkeit, Inline-Listener-Funktionen zu entfernen? Wie 'server.on ('verbinden', Funktion (pkt) {...});' – kBisla

15

Oder Sie verwenden:

stdin.once statt stdin.on