1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- /**
- * 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;
|