Overview
Looking at debouncing and throttling function calls in JavaScript.
My source code on StackBlitz.com.
Because I am using global variables to keep track of the state, the function debounce() and throttle()
do not support debouncing and throttling multiple function at the same time.
- Throttling and Debouncing in JavaScript blog post by Jhey Tompkins
- Which contains slightly more complicated version of throttle() function than mine.
- A visual demo by nimius.net : Demo.
Html
JavaScript
let _inThrottleIgnoredCount = 0; let _inThrottle = false; function throttle(func, limit = 100) { return function() { const args = arguments; const context = this; if (_inThrottle) { // Do not allow the call, just count the number of ignored call _inThrottleIgnoredCount += 1; } else { _inThrottle = true; // Do not allow any more call _inThrottleIgnoredCount = 0; func.apply(context, args); // Make the first call // Set timer for the period for which we will not allow calls setTimeout(function () { _inThrottle = false; // Allow call again if(_inThrottleIgnoredCount > 0) { // If at least one call came during the period for // which we were not supposed to accept call, then // let's execute the function one last time _inThrottleIgnoredCount = 0; func.apply(context, args); // Call one last time } }, limit); } } } let _inDebounce = null; function debounce(func, delay = 100) { return function() { const context = this; const args = arguments; if(_inDebounce !== null) { clearTimeout(_inDebounce); // Cancel pending call console.log(`Cancel call`); } _inDebounce = setTimeout(() => { _inDebounce = null; func.apply(context, args); }, delay); } } function doSomething() {
console.log('doSomething'); }
No comments:
Post a Comment