diff options
Diffstat (limited to 'std')
-rw-r--r-- | std/node/events.ts | 16 | ||||
-rw-r--r-- | std/node/events_test.ts | 19 |
2 files changed, 28 insertions, 7 deletions
diff --git a/std/node/events.ts b/std/node/events.ts index cb9acb0f5..fee715f0c 100644 --- a/std/node/events.ts +++ b/std/node/events.ts @@ -279,13 +279,15 @@ export default class EventEmitter { return this; } - if (eventName && this._events.has(eventName)) { - const listeners = (this._events.get(eventName) as Array< - Function | WrappedFunction - >).slice(); // Create a copy; We use it AFTER it's deleted. - this._events.delete(eventName); - for (const listener of listeners) { - this.emit("removeListener", eventName, listener); + if (eventName) { + if (this._events.has(eventName)) { + const listeners = (this._events.get(eventName) as Array< + Function | WrappedFunction + >).slice(); // Create a copy; We use it AFTER it's deleted. + this._events.delete(eventName); + for (const listener of listeners) { + this.emit("removeListener", eventName, listener); + } } } else { const eventList: [string | symbol] = this.eventNames(); diff --git a/std/node/events_test.ts b/std/node/events_test.ts index 3c3628e3a..4b47686f4 100644 --- a/std/node/events_test.ts +++ b/std/node/events_test.ts @@ -246,6 +246,25 @@ test({ }); test({ + name: "Provide a non-existent event to removeAllListeners will do nothing", + fn() { + const testEmitter = new EventEmitter(); + testEmitter.on("event", shouldNeverBeEmitted); + testEmitter.on("event", shouldNeverBeEmitted); + testEmitter.on("other event", shouldNeverBeEmitted); + testEmitter.on("other event", shouldNeverBeEmitted); + testEmitter.once("other event", shouldNeverBeEmitted); + assertEquals(testEmitter.listenerCount("event"), 2); + assertEquals(testEmitter.listenerCount("other event"), 3); + + testEmitter.removeAllListeners("non-existent"); + + assertEquals(testEmitter.listenerCount("event"), 2); + assertEquals(testEmitter.listenerCount("other event"), 3); + }, +}); + +test({ name: "Remove individual listeners, which can also be chained", fn() { const testEmitter = new EventEmitter(); |