45 lines
		
	
	
		
			852 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			852 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Throttle decorator
 | 
						|
 * @param {Function} fn
 | 
						|
 * @param {Number} freq
 | 
						|
 * @return {Function}
 | 
						|
 */
 | 
						|
function throttle(fn, freq) {
 | 
						|
  let timestamp = 0;
 | 
						|
  let threshold = 1000 / freq;
 | 
						|
  let lastArgs;
 | 
						|
  let timer;
 | 
						|
 | 
						|
  const invoke = (args, now = Date.now()) => {
 | 
						|
    timestamp = now;
 | 
						|
    lastArgs = null;
 | 
						|
    if (timer) {
 | 
						|
      clearTimeout(timer);
 | 
						|
      timer = null;
 | 
						|
    }
 | 
						|
    fn(...args);
 | 
						|
  }
 | 
						|
 | 
						|
  const throttled = (...args) => {
 | 
						|
    const now = Date.now();
 | 
						|
    const passed = now - timestamp;
 | 
						|
    if ( passed >= threshold) {
 | 
						|
      invoke(args, now);
 | 
						|
    } else {
 | 
						|
      lastArgs = args;
 | 
						|
      if (!timer) {
 | 
						|
        timer = setTimeout(() => {
 | 
						|
          timer = null;
 | 
						|
          invoke(lastArgs)
 | 
						|
        }, threshold - passed);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const flush = () => lastArgs && invoke(lastArgs);
 | 
						|
 | 
						|
  return [throttled, flush];
 | 
						|
}
 | 
						|
 | 
						|
export default throttle;
 |