mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
/**
 | 
						|
 * From underscore's `_.throttle`
 | 
						|
 * http://underscorejs.org
 | 
						|
 * (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 | 
						|
 * Underscore may be freely distributed under the MIT license.
 | 
						|
 *
 | 
						|
 * Returns a function, that, when invoked, will only be triggered at most once during a
 | 
						|
 * given window of time. The throttled function will run as much as it can, without ever
 | 
						|
 * going more than once per wait duration.
 | 
						|
 *
 | 
						|
 * @param  {Function} func
 | 
						|
 *         The function to throttle
 | 
						|
 * @param  {number} wait
 | 
						|
 *         The wait period
 | 
						|
 * @param  {Object} scope
 | 
						|
 *         The scope to use for func
 | 
						|
 * @return {Function} The throttled function
 | 
						|
 */
 | 
						|
function throttle(func, wait, scope) {
 | 
						|
  let args, result;
 | 
						|
  let timeout = null;
 | 
						|
  let previous = 0;
 | 
						|
 | 
						|
  const later = function() {
 | 
						|
    previous = Date.now();
 | 
						|
    timeout = null;
 | 
						|
    result = func.apply(scope, args);
 | 
						|
    args = null;
 | 
						|
  };
 | 
						|
 | 
						|
  const throttledFunction = function() {
 | 
						|
    const now = Date.now();
 | 
						|
    const remaining = wait - (now - previous);
 | 
						|
    args = arguments;
 | 
						|
    if (remaining <= 0) {
 | 
						|
      clearTimeout(timeout);
 | 
						|
      timeout = null;
 | 
						|
      previous = now;
 | 
						|
      result = func.apply(scope, args);
 | 
						|
      args = null;
 | 
						|
    } else if (!timeout) {
 | 
						|
      timeout = setTimeout(later, remaining);
 | 
						|
    }
 | 
						|
    return result;
 | 
						|
  };
 | 
						|
 | 
						|
  function cancel() {
 | 
						|
    if (timeout) {
 | 
						|
      clearTimeout(timeout);
 | 
						|
      timeout = null;
 | 
						|
    }
 | 
						|
    previous = 0;
 | 
						|
    args = undefined;
 | 
						|
    result = undefined;
 | 
						|
  }
 | 
						|
 | 
						|
  function flush() {
 | 
						|
    if (!timeout) {
 | 
						|
      return result;
 | 
						|
    }
 | 
						|
    previous = 0;
 | 
						|
    return throttledFunction();
 | 
						|
  }
 | 
						|
 | 
						|
  throttledFunction.cancel = cancel;
 | 
						|
  throttledFunction.flush = flush;
 | 
						|
 | 
						|
  return throttledFunction;
 | 
						|
}
 | 
						|
 | 
						|
exports.throttle = throttle;
 |