|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|