Created
February 4, 2014 16:32
-
-
Save nmsdvid/8807205 to your computer and use it in GitHub Desktop.
Simple JavaScript Debounce Function
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Returns 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. If `immediate` is passed, trigger the function on the | |
// leading edge, instead of the trailing. | |
function debounce(func, wait, immediate) { | |
var timeout; | |
return function() { | |
var context = this, args = arguments; | |
clearTimeout(timeout); | |
timeout = setTimeout(function() { | |
timeout = null; | |
if (!immediate) func.apply(context, args); | |
}, wait); | |
if (immediate && !timeout) func.apply(context, args); | |
}; | |
} | |
/* minified */ | |
function debounce(a,b,c){var d;return function(){var e=this,f=arguments;clearTimeout(d),d=setTimeout(function(){d=null,c||a.apply(e,f)},b),c&&!d&&a.apply(e,f)}} | |
/* usage */ | |
var myEfficientFn = debounce(function() { | |
// All the taxing stuff you do | |
}, 250); | |
window.addEventListener('resize', myEfficientFn); |
I suggest adding to our debounce
function return type unknown
or I prefer typeof func
as shown on line 4 below:
function debounce<T>(
func: (...args: T[]) => unknown,
delay = 200
): typeof func {
let timeout: number | NodeJS.Timeout;
return function (...args: T[]) {
clearTimeout(timeout as number);
timeout = setTimeout(() => func(...args), delay);
};
}
Without it results may be faced with type conversion issues a la ts(2352).
As indicated above, in the main gist function, using immediate
will break the implementation
So, for such needs where we wanted to call the function immediately (leading edge instead of trailing)
Try this implementation https://youmightnotneed.com/lodash#function
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
My TypeScript solution:
or maybe (also when running in node or web)