mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-28 09:12:25 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * 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. The function also has a property 'clear' 
 | |
|  * that is a function which will clear the timer to prevent previously scheduled executions. 
 | |
|  *
 | |
|  * @source underscore.js
 | |
|  * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/
 | |
|  * @param {Function} function to wrap
 | |
|  * @param {Number} timeout in ms (`100`)
 | |
|  * @param {Boolean} whether to execute at the beginning (`false`)
 | |
|  * @api public
 | |
|  */
 | |
| function debounce(func, wait, immediate) {
 | |
|   var timeout, args, context, timestamp, result;
 | |
|   if (null == wait) wait = 100;
 | |
| 
 | |
|   function later() {
 | |
|     var last = Date.now() - timestamp;
 | |
| 
 | |
|     if (last < wait && last >= 0) {
 | |
|       timeout = setTimeout(later, wait - last);
 | |
|     } else {
 | |
|       timeout = null;
 | |
|       if (!immediate) {
 | |
|         result = func.apply(context, args);
 | |
|         context = args = null;
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   var debounced = function () {
 | |
|     context = this;
 | |
|     args = arguments;
 | |
|     timestamp = Date.now();
 | |
|     var callNow = immediate && !timeout;
 | |
|     if (!timeout) timeout = setTimeout(later, wait);
 | |
|     if (callNow) {
 | |
|       result = func.apply(context, args);
 | |
|       context = args = null;
 | |
|     }
 | |
| 
 | |
|     return result;
 | |
|   };
 | |
| 
 | |
|   debounced.clear = function () {
 | |
|     if (timeout) {
 | |
|       clearTimeout(timeout);
 | |
|       timeout = null;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   debounced.flush = function () {
 | |
|     if (timeout) {
 | |
|       result = func.apply(context, args);
 | |
|       context = args = null;
 | |
| 
 | |
|       clearTimeout(timeout);
 | |
|       timeout = null;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return debounced;
 | |
| };
 | |
| 
 | |
| // Adds compatibility for ES modules
 | |
| debounce.debounce = debounce;
 | |
| 
 | |
| module.exports = debounce;
 |