UNPKG

ut2

Version:

一个现代 JavaScript 实用工具库。[点击查看在线文档]。

80 lines (77 loc) 2.69 kB
import defaultTo from '../defaultTo.js'; import toNumber from '../toNumber.js'; import { FUNC_ERROR_TEXT } from './helpers.js'; import { nativeUndefined } from './native.js'; function baseDebounce(func, wait, immediate, __throttle__) { if (__throttle__ === void 0) { __throttle__ = false; } if (typeof func !== 'function') { throw new TypeError(FUNC_ERROR_TEXT); } var timer, lastCallTime, lastInvokeTime, lastArgs, lastThis, result; wait = defaultTo(toNumber(wait), 0); function shouldInvoke(time) { if (lastCallTime === nativeUndefined) { return true; } var timeSinceLastCall = time - lastCallTime; var timeSinceLastInvoke = time - lastInvokeTime; return timeSinceLastCall >= wait || timeSinceLastCall < 0 || (__throttle__ && timeSinceLastInvoke >= wait); } function invokeFunc(time) { lastInvokeTime = time; result = func.apply(lastThis, lastArgs); lastThis = lastArgs = nativeUndefined; return result; } function debounced() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } lastThis = this; lastArgs = args; var time = Date.now(); var isInvoke = shouldInvoke(time); var waitTime = !__throttle__ ? wait : !isInvoke && lastCallTime !== nativeUndefined && timer === nativeUndefined ? wait - (time - lastCallTime) : wait; lastCallTime = time; if (isInvoke) { if (immediate && timer === nativeUndefined) { return invokeFunc(time); } } if (timer !== nativeUndefined && !__throttle__) { clearTimeout(timer); timer = nativeUndefined; } if (timer === nativeUndefined) { timer = setTimeout(function () { timer = nativeUndefined; invokeFunc(Date.now()); }, waitTime); } return result; } function cancel() { if (timer !== nativeUndefined) { clearTimeout(timer); timer = nativeUndefined; } lastCallTime = timer = lastArgs = lastThis = nativeUndefined; } function flush() { if (timer !== nativeUndefined) { clearTimeout(timer); timer = nativeUndefined; return invokeFunc(Date.now()); } return result; } function pending() { return timer !== nativeUndefined; } debounced.cancel = cancel; debounced.flush = flush; debounced.pending = pending; return debounced; } export { baseDebounce as default };