1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| 'use strict';
|
| /**
| * Throttle decorator
| * @param {Function} fn
| * @param {Number} freq
| * @return {Function}
| */
| function throttle(fn, freq) {
| let timestamp = 0;
| const threshold = 1000 / freq;
| let timer = null;
| return function throttled(force, args) {
| const now = Date.now();
| if (force || now - timestamp > threshold) {
| if (timer) {
| clearTimeout(timer);
| timer = null;
| }
| timestamp = now;
| return fn.apply(null, args);
| }
| if (!timer) {
| timer = setTimeout(() => {
| timer = null;
| timestamp = Date.now();
| return fn.apply(null, args);
| }, threshold - (now - timestamp));
| }
| };
| }
|
| export default throttle;
|
|