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.
		
		
		
		
		
			
		
			
				
					52 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					52 lines
				
				1.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								define(['./now'], function (now) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // 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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return throttle;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								});
							 |