/** * @file * Adapted from underscore.js with the addition Drupal namespace. */ /** * Limits the invocations of a function in a given time frame. * * The debounce function wrapper should be used sparingly. One clear use case * is limiting the invocation of a callback attached to the window resize event. * * Before using the debounce function wrapper, consider first whether the * callback could be attached to an event that fires less frequently or if the * function can be written in such a way that it is only invoked under specific * conditions. * * @param {function} func * The function to be invoked. * @param {number} wait * The time period within which the callback function should only be * invoked once. For example if the wait period is 250ms, then the callback * will only be called at most 4 times per second. * @param {boolean} immediate * Whether we wait at the beginning or end to execute the function. * * @return {function} * The debounced function. */ Drupal.debounce = function (func, wait, immediate) { let timeout; let result; return function (...args) { const context = this; const later = function () { timeout = null; if (!immediate) { result = func.apply(context, args); } }; const callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) { result = func.apply(context, args); } return result; }; };