You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					50 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					50 lines
				
				1.4 KiB
			| 
											3 years ago
										 | var now = require('./now.js'); | ||
|  | 
 | ||
|  | // Returns a function, that, when invoked, will only be triggered at most once
 | ||
|  | // during a given window of time. Normally, the throttled function will run
 | ||
|  | // as much as it can, without ever going more than once per `wait` duration;
 | ||
|  | // but if you'd like to disable the execution on the leading edge, pass
 | ||
|  | // `{leading: false}`. To disable execution on the trailing edge, ditto.
 | ||
|  | function throttle(func, wait, options) { | ||
|  |   var timeout, context, args, result; | ||
|  |   var previous = 0; | ||
|  |   if (!options) options = {}; | ||
|  | 
 | ||
|  |   var later = function() { | ||
|  |     previous = options.leading === false ? 0 : now(); | ||
|  |     timeout = null; | ||
|  |     result = func.apply(context, args); | ||
|  |     if (!timeout) context = args = null; | ||
|  |   }; | ||
|  | 
 | ||
|  |   var throttled = function() { | ||
|  |     var _now = now(); | ||
|  |     if (!previous && options.leading === false) previous = _now; | ||
|  |     var remaining = wait - (_now - previous); | ||
|  |     context = this; | ||
|  |     args = arguments; | ||
|  |     if (remaining <= 0 || remaining > wait) { | ||
|  |       if (timeout) { | ||
|  |         clearTimeout(timeout); | ||
|  |         timeout = null; | ||
|  |       } | ||
|  |       previous = _now; | ||
|  |       result = func.apply(context, args); | ||
|  |       if (!timeout) context = args = null; | ||
|  |     } else if (!timeout && options.trailing !== false) { | ||
|  |       timeout = setTimeout(later, remaining); | ||
|  |     } | ||
|  |     return result; | ||
|  |   }; | ||
|  | 
 | ||
|  |   throttled.cancel = function() { | ||
|  |     clearTimeout(timeout); | ||
|  |     previous = 0; | ||
|  |     timeout = context = args = null; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return throttled; | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = throttle; |