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;
							 |