summaryrefslogtreecommitdiff
path: root/lib/events.js
diff options
context:
space:
mode:
authorArnout Kazemier <info@3rd-Eden.com>2011-03-18 21:02:14 +0100
committerRyan Dahl <ry@tinyclouds.org>2011-03-25 11:51:29 -0700
commit53bec1c8625c38888a15f7eb278cc19a212c154a (patch)
tree49458b1359174a84bd67e4c43824f1f47cdc6321 /lib/events.js
parent0fb44a2f93ef13be20086ab4288c9a7166905536 (diff)
downloadnode-53bec1c8625c38888a15f7eb278cc19a212c154a.tar.gz
Added support for removing .once listeners
Closes GH-806.
Diffstat (limited to 'lib/events.js')
-rw-r--r--lib/events.js26
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];
}