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
861 B
44 lines
861 B
/** |
|
* 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.apply(null, 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;
|
|
|