events: don't delete the listeners array
authorBen Noordhuis <info@bnoordhuis.nl>
Thu, 15 Mar 2012 23:18:50 +0000 (00:18 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 15 Mar 2012 23:20:10 +0000 (00:20 +0100)
The documentation implies that .removeAllListeners() leaves the listeners array
untouched. Make it so.

lib/events.js
test/simple/test-event-emitter-remove-all-listeners.js

index 1fff1e3..69e29ea 100644 (file)
@@ -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;
 };
 
index f5676f4..39e6468 100644 (file)
@@ -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);