Spaces:
Sleeping
Sleeping
| /** | |
| * 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; | |