| | |
| | | * @param {Function} fnc |
| | | * @param {Number} wait |
| | | * @returns {Function} |
| | | * @tutorial Tools.debounce(<fnc>, <wait>)(<DebounceKey>) |
| | | */ |
| | | static debounce(fnc, wait = 200) { |
| | | let timeout = null; |
| | | return function() { |
| | | const context = this; |
| | | const args = arguments; |
| | | if (timeout) { |
| | | clearTimeout(timeout); |
| | | return key => { |
| | | if (!key || !Tools.isString(key)) { |
| | | throw 'Debounce function need a key!'; |
| | | } |
| | | const callNow = !timeout; |
| | | timeout = setTimeout(() => { |
| | | timeout = null; |
| | | }, wait); |
| | | if (callNow) { |
| | | fnc.apply(context, args); |
| | | const timer = Tools.debounce['dKey-' + key]; |
| | | if (timer) { |
| | | clearTimeout(timer); |
| | | } |
| | | Tools.debounce['dKey-' + key] = setTimeout(fnc, wait); |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * 节流函数(一段时间周期内,仅执行第一次回调) |
| | | * 节流函数(本段时间内,仅执行第一次回调) |
| | | * 在一定时间内只能触发一次函数执行 |
| | | * 如果这个时间内再次触发,则忽略,直到下一个时间段再次触发 |
| | | * @param {Function} fnc |
| | | * @param {Number} wait |
| | | * @returns {Function} |
| | | * @returns {function(key):void} |
| | | * @tutorial Tools.throttle(<fnc>, <wait>)(<ThrottleKey>) |
| | | */ |
| | | static throttle(fnc, wait = 200) { |
| | | let previous = 0; |
| | | return function() { |
| | | const context = this; |
| | | const args = arguments; |
| | | const now = new Date(); |
| | | return key => { |
| | | if (!key || !Tools.isString(key)) { |
| | | throw 'Throttle function need a key!'; |
| | | } |
| | | const previous = Tools.throttle['tKey-' + key] || 0; |
| | | const now = Date.now(); |
| | | if (now - previous > wait) { |
| | | fnc.apply(context, args); |
| | | previous = now; |
| | | Tools.throttle['tKey-' + key] = now; |
| | | fnc(); |
| | | } |
| | | }; |
| | | } |
| | |
| | | }; |
| | | } |
| | | |
| | | global.Tools = Tools; |