@terminus/ngx-tools
Version:
[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github
40 lines • 4.21 kB
JavaScript
/**
* Return a function, that, as long as it continues to be invoked, will not be triggered. The
* function will be called after it stops being called for N milliseconds.
*
* @param func - The function to call after the debounce period
* @param wait - The length of time to wait between calls (ms)
* @param immediate - Whether the debounced function should be fired immediately
* @param windowRef - A reference to the global window object
* @returns The debounced function
*
* @example
* const myFunc = () => {console.log('hi!')};
* const myDebouncedFunc = debounce(myFunc, 200);
* myDebouncedFunc();
* myDebouncedFunc();
* myDebouncedFunc();
* // 'hi!' will only be logged once
*/
export function debounce(func, wait, immediate = false, windowRef = window) {
let timeout = null;
return function () {
const context = this;
const args = arguments;
const later = function () {
timeout = null;
if (!immediate) {
func.apply(context, args);
}
};
const callNow = immediate && !timeout;
if (timeout) {
clearTimeout(timeout);
}
timeout = windowRef.setTimeout(later, wait);
if (callNow) {
func.apply(context, args);
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVib3VuY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGVybWludXMvbmd4LXRvb2xzL3V0aWxpdGllcy8iLCJzb3VyY2VzIjpbImRlYm91bmNlL2RlYm91bmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLElBQWMsRUFDZCxJQUFZLEVBQ1osU0FBUyxHQUFHLEtBQUssRUFDakIsWUFBb0IsTUFBTTtJQUUxQixJQUFJLE9BQU8sR0FBa0IsSUFBSSxDQUFDO0lBRWxDLE9BQU87UUFDTCxNQUFNLE9BQU8sR0FBWSxJQUFJLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHO1lBQ1osT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFdEMsSUFBSSxPQUFPLEVBQUU7WUFDWCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdkI7UUFFRCxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uLCB0aGF0LCBhcyBsb25nIGFzIGl0IGNvbnRpbnVlcyB0byBiZSBpbnZva2VkLCB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQuIFRoZVxuICogZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvciBOIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIHRoZSBkZWJvdW5jZSBwZXJpb2RcbiAqIEBwYXJhbSB3YWl0IC0gVGhlIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQgYmV0d2VlbiBjYWxscyAobXMpXG4gKiBAcGFyYW0gaW1tZWRpYXRlIC0gV2hldGhlciB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHNob3VsZCBiZSBmaXJlZCBpbW1lZGlhdGVseVxuICogQHBhcmFtIHdpbmRvd1JlZiAtIEEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdFxuICogQHJldHVybnMgVGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBteUZ1bmMgPSAoKSA9PiB7Y29uc29sZS5sb2coJ2hpIScpfTtcbiAqIGNvbnN0IG15RGVib3VuY2VkRnVuYyA9IGRlYm91bmNlKG15RnVuYywgMjAwKTtcbiAqIG15RGVib3VuY2VkRnVuYygpO1xuICogbXlEZWJvdW5jZWRGdW5jKCk7XG4gKiBteURlYm91bmNlZEZ1bmMoKTtcbiAqIC8vICdoaSEnIHdpbGwgb25seSBiZSBsb2dnZWQgb25jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8Q29udGV4dD4oXG4gIGZ1bmM6IEZ1bmN0aW9uLFxuICB3YWl0OiBudW1iZXIsXG4gIGltbWVkaWF0ZSA9IGZhbHNlLFxuICB3aW5kb3dSZWY6IFdpbmRvdyA9IHdpbmRvdyxcbik6IEZ1bmN0aW9uIHtcbiAgbGV0IHRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHJldHVybiBmdW5jdGlvbih0aGlzOiBDb250ZXh0KSB7XG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IHRoaXM7XG4gICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cztcbiAgICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcblxuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgfVxuXG4gICAgdGltZW91dCA9IHdpbmRvd1JlZi5zZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblxuICAgIGlmIChjYWxsTm93KSB7XG4gICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==