fix(segmentation): Allow for debounced pub/sub events to be reliably cancelled when unsubscribed to. (#5092)

This commit is contained in:
Joe Boccanfuso authored and GitHub committed 2025-06-02 12:12:31 -04:00
1 parent a1fb7217bd
commit 38ed7ba744
5 files changed
+36 -9

No files matched your search

@@ -54,7 +54,10 @@ function _unsubscribe(eventName, listenerId) {
const listeners = this.listeners[eventName];
if (Array.isArray(listeners)) {
this.listeners[eventName] = listeners.filter(({ id }) => id !== listenerId);
this.listeners[eventName] = listeners.filter(({ id, callback }) => {
callback?.clearDebounceTimeout?.();
return id !== listenerId;
});
} else {
this.listeners[eventName] = undefined;
}
@@ -134,6 +137,13 @@ export class PubSubService {
reset() {
this.unsubscriptions.forEach(unsub => unsub());
this.unsubscriptions = [];
Object.keys(this.listeners).forEach(eventName =>
this.listeners[eventName].forEach(({ callback }) => {
callback?.clearDebounceTimeout?.();
})
);
this.listeners = {};
}
/**
+10 -1
View File
@@ -2,9 +2,11 @@
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
// The callback function returned is assigned a clearDebounceTimeout function
// that provides for clearing the timeout/debounced function so that it is not called.
function debounce(func, wait, immediate) {
var timeout;
return function () {
const callback = function () {
var context = this,
args = arguments;
var later = function () {
@@ -20,6 +22,13 @@ function debounce(func, wait, immediate) {
func.apply(context, args);
}
};
callback.clearDebounceTimeout = () => {
clearTimeout(timeout);
timeout = null;
};
return callback;
}
export default debounce;