Fix #3425: removeAllListeners should delete array

When removeAllListeners is called, the listeners array
is deleted to maintain compatibility with v0.6.

Reverts "events: don't delete the listeners array"

This reverts commit 78dc13fbf9.

Conflicts:

	test/simple/test-event-emitter-remove-all-listeners.js
pull/24503/head
Reid Burke 2012-06-13 12:25:43 -05:00 committed by isaacs
parent 13400e3e58
commit c9a1b5d162
2 changed files with 11 additions and 13 deletions

View File

@ -228,15 +228,8 @@ EventEmitter.prototype.removeAllListeners = function(type) {
return this; return this;
} }
var events = this._events && this._events[type]; // does not use listeners(), so no side effect of creating _events[type]
if (!events) return this; if (type && this._events && this._events[type]) this._events[type] = null;
if (isArray(events)) {
events.splice(0);
} else {
this._events[type] = null;
}
return this; return this;
}; };

View File

@ -39,10 +39,15 @@ e1.removeAllListeners('baz');
assert.deepEqual(e1.listeners('foo'), [listener]); assert.deepEqual(e1.listeners('foo'), [listener]);
assert.deepEqual(e1.listeners('bar'), []); assert.deepEqual(e1.listeners('bar'), []);
assert.deepEqual(e1.listeners('baz'), []); assert.deepEqual(e1.listeners('baz'), []);
// identity check, the array should not change // after calling removeAllListeners,
assert.equal(e1.listeners('foo'), fooListeners); // the old listeners array should stay unchanged
assert.equal(e1.listeners('bar'), barListeners); assert.deepEqual(fooListeners, [listener]);
assert.equal(e1.listeners('baz'), bazListeners); assert.deepEqual(barListeners, [listener]);
assert.deepEqual(bazListeners, [listener, listener]);
// after calling removeAllListeners,
// new listeners arrays are different from the old
assert.notEqual(e1.listeners('bar'), barListeners);
assert.notEqual(e1.listeners('baz'), bazListeners);
var e2 = new events.EventEmitter(); var e2 = new events.EventEmitter();
e2.on('foo', listener); e2.on('foo', listener);