diff --git a/source/event-emitter.ts b/source/event-emitter.ts index 64cdcb0..0b753c0 100644 --- a/source/event-emitter.ts +++ b/source/event-emitter.ts @@ -122,19 +122,21 @@ export class EventEmitter { const listeners = this.#listeners.get(type); if (!listeners) return; - // If no listener is provided, remove all listeners for the event type. + // Find the listener entries (If a listener was provided, only 1 entry will be returned. Otherwise, all entries will be returned). + const listenerEntries = Array.from(listeners).filter((entry) => !listener || entry.listener === listener || entry.wrappedListener === listener); + + // Remove the listener entries from the listeners set. + listenerEntries.forEach((entry) => { + // Set the wrapped listener to a no-op function to prevent it from being called by debounced events after it's been removed. + entry.wrappedListener = (): void => {}; + + // Remove the listener entry from the listeners set. + listeners.delete(entry); + }); + + // If no listener was provided, remove the listeners set from the listeners map. if (!listener) { this.#listeners.delete(type); - - return; - } - - // Find the listener entry. - const listenerEntry = Array.from(listeners).find((entry) => entry.listener === listener || entry.wrappedListener === listener); - - // If the listener entry is found, remove it from the listeners map. - if (listenerEntry) { - listeners.delete(listenerEntry); } }