diff options
author | Arnout Kazemier <info@3rd-Eden.com> | 2011-03-18 21:02:14 +0100 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-03-25 11:51:29 -0700 |
commit | 53bec1c8625c38888a15f7eb278cc19a212c154a (patch) | |
tree | 49458b1359174a84bd67e4c43824f1f47cdc6321 /lib/events.js | |
parent | 0fb44a2f93ef13be20086ab4288c9a7166905536 (diff) | |
download | node-53bec1c8625c38888a15f7eb278cc19a212c154a.tar.gz |
Added support for removing .once listeners
Closes GH-806.
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]; } |