Off mutes debounced events
This commit is contained in:
+13
-11
@@ -122,19 +122,21 @@ export class EventEmitter<T extends EventMap> {
|
|||||||
const listeners = this.#listeners.get(type);
|
const listeners = this.#listeners.get(type);
|
||||||
if (!listeners) return;
|
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) {
|
if (!listener) {
|
||||||
this.#listeners.delete(type);
|
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user