ut2
Version:
一个现代 JavaScript 实用工具库。[点击查看在线文档]。
80 lines (77 loc) • 2.69 kB
JavaScript
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 };