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