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.
		
		
		
		
		
			
		
			
				
					44 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					44 lines
				
				1.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								define(['./restArguments', './now'], function (restArguments, now) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // When a sequence of calls of the returned function ends, the argument
							 | 
						||
| 
								 | 
							
								  // function is triggered. The end of a sequence is defined by the `wait`
							 | 
						||
| 
								 | 
							
								  // parameter. If `immediate` is passed, the argument function will be
							 | 
						||
| 
								 | 
							
								  // triggered at the beginning of the sequence instead of at the end.
							 | 
						||
| 
								 | 
							
								  function debounce(func, wait, immediate) {
							 | 
						||
| 
								 | 
							
								    var timeout, previous, args, result, context;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var later = function() {
							 | 
						||
| 
								 | 
							
								      var passed = now() - previous;
							 | 
						||
| 
								 | 
							
								      if (wait > passed) {
							 | 
						||
| 
								 | 
							
								        timeout = setTimeout(later, wait - passed);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        timeout = null;
							 | 
						||
| 
								 | 
							
								        if (!immediate) result = func.apply(context, args);
							 | 
						||
| 
								 | 
							
								        // This check is needed because `func` can recursively invoke `debounced`.
							 | 
						||
| 
								 | 
							
								        if (!timeout) args = context = null;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var debounced = restArguments(function(_args) {
							 | 
						||
| 
								 | 
							
								      context = this;
							 | 
						||
| 
								 | 
							
								      args = _args;
							 | 
						||
| 
								 | 
							
								      previous = now();
							 | 
						||
| 
								 | 
							
								      if (!timeout) {
							 | 
						||
| 
								 | 
							
								        timeout = setTimeout(later, wait);
							 | 
						||
| 
								 | 
							
								        if (immediate) result = func.apply(context, args);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return result;
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    debounced.cancel = function() {
							 | 
						||
| 
								 | 
							
								      clearTimeout(timeout);
							 | 
						||
| 
								 | 
							
								      timeout = args = context = null;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return debounced;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return debounce;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								});
							 |