diff options
Diffstat (limited to 'lib/events.js')
-rw-r--r-- | lib/events.js | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/lib/events.js b/lib/events.js index 2d2d5d19c..6fe55bb3d 100644 --- a/lib/events.js +++ b/lib/events.js @@ -138,10 +138,13 @@ EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.once = function(type, listener) { var self = this; - self.on(type, function g() { + function g() { self.removeListener(type, g); listener.apply(this, arguments); - }); + }; + + g.listener = listener; + self.on(type, g); return this; }; @@ -157,12 +160,23 @@ EventEmitter.prototype.removeListener = function(type, listener) { var list = this._events[type]; if (isArray(list)) { - var i = list.indexOf(listener); - if (i < 0) return this; - list.splice(i, 1); + var position = -1; + for (var i = 0, length = list.length; i < length; i++) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) + { + position = i; + break; + } + } + + if (position < 0) return this; + list.splice(position, 1); if (list.length == 0) delete this._events[type]; - } else if (this._events[type] === listener) { + } else if (list === listener || + (list.listener && list.listener === listener)) + { delete this._events[type]; } |