Permalink
Browse files

events: don't delete the listeners array

The documentation implies that .removeAllListeners() leaves the listeners array
untouched. Make it so.
  • Loading branch information...
1 parent f9aa01d commit 78dc13fbf97e2e3003e6f3baacdd5ff60e8de3f7 @bnoordhuis bnoordhuis committed Mar 15, 2012
Showing with 16 additions and 5 deletions.
  1. +9 −2 lib/events.js
  2. +7 −3 test/simple/test-event-emitter-remove-all-listeners.js
View
@@ -203,8 +203,15 @@ EventEmitter.prototype.removeAllListeners = function(type) {
return this;
}
- // does not use listeners(), so no side effect of creating _events[type]
- if (type && this._events && this._events[type]) this._events[type] = null;
+ var events = this._events && this._events[type];
+ if (!events) return this;
+
+ if (isArray(events)) {
+ events.splice(0);
+ } else {
+ this._events[type] = null;
+ }
+
return this;
};
@@ -29,10 +29,14 @@ function listener() {}
var e1 = new events.EventEmitter();
e1.on('foo', listener);
e1.on('bar', listener);
+var fooListeners = e1.listeners('foo');
+var barListeners = e1.listeners('bar');
e1.removeAllListeners('foo');
-assert.deepEqual([], e1.listeners('foo'));
-assert.deepEqual([listener], e1.listeners('bar'));
-
+assert.deepEqual(e1.listeners('foo'), []);
+assert.deepEqual(e1.listeners('bar'), [listener]);
+// identity check, the array should not change
+assert.equal(e1.listeners('foo'), fooListeners);
+assert.equal(e1.listeners('bar'), barListeners);
var e2 = new events.EventEmitter();
e2.on('foo', listener);

0 comments on commit 78dc13f

Please sign in to comment.