"Extend" die EventEmitter wie folgt aus:
var EventEmitter = require('events').EventEmitter;
EventEmitter.prototype.once = function(events, handler){
// no events, get out!
if(! events)
return;
// Ugly, but helps getting the rest of the function
// short and simple to the eye ... I guess...
if(!(events instanceof Array))
events = [events];
var _this = this;
var cb = function(){
events.forEach(function(e){
// This only removes the listener itself
// from all the events that are listening to it
// i.e., does not remove other listeners to the same event!
_this.removeListener(e, cb);
});
// This will allow any args you put in xxx.emit('event', ...) to be sent
// to your handler
handler.apply(_this, Array.prototype.slice.call(arguments, 0));
};
events.forEach(function(e){
_this.addListener(e, cb);
});
};
ich hier einen Kern erstellt: https://gist.github.com/3627823 enthält ein Beispiel (Ihr Beispiel mit einigen Protokollen)
[UPDATE] Fol Brüllen ist eine Anpassung meiner Implementierung von once
, dass nur das Ereignis entfernt, die genannt wurde, wie in den Kommentaren angefordert:
var EventEmitter = require('events').EventEmitter;
EventEmitter.prototype.once = function(events, handler){
// no events, get out!
if(! events)
return;
// Ugly, but helps getting the rest of the function
// short and simple to the eye ... I guess...
if(!(events instanceof Array))
events = [events];
var _this = this;
// A helper function that will generate a handler that
// removes itself when its called
var gen_cb = function(event_name){
var cb = function(){
_this.removeListener(event_name, cb);
// This will allow any args you put in
// xxx.emit('event', ...) to be sent
// to your handler
handler.apply(_this, Array.prototype.slice.call(arguments, 0));
};
return cb;
};
events.forEach(function(e){
_this.addListener(e, gen_cb(e));
});
};
Ich fand heraus, dass node.js bereits eine once
Methode im EventEmitter hat: Check here the source code, aber das ist wahrscheinlich eine neue Ergänzung.
Dies bricht tatsächlich 'removeListener' von der Arbeit, wie es vorher war. Vielleicht könnte diese Antwort erweitert werden, um das zu beheben. – Harry
Möchten Sie, dass der 'removeListener' nur das Ereignis löscht, das aufgerufen wurde, und nicht alle Ereignisse, die als 'events'-Argument gesendet werden? Sobald ich eine Vorstellung davon habe, was du willst, werde ich meine Antwort aktualisieren. – fableal
Nur das Ereignis, das gesendet wurde, wäre großartig. – Harry