@ryanuo/utils
Version:
提供多种实用工具函数,涵盖算法、浏览器操作、网络请求等多个领域
64 lines (63 loc) • 1.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.curry = curry;
exports.debounce = debounce;
exports.getUuid = getUuid;
exports.safeJSONParse = safeJSONParse;
exports.throttle = throttle;
function getUuid() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
const r = Math.random() * 16 | 0;
const v = c === "x" ? r : r & 3 | 8;
return v.toString(16);
});
}
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) return fn(...args);
return function (...nextArgs) {
const combinedArgs = [...args, ...nextArgs];
return curried(...combinedArgs);
};
};
}
function safeJSONParse(json) {
try {
return JSON.parse(json);
} catch (e) {
return null;
}
}
function debounce(fn, delay, immediate = false) {
let timer = null;
return (...args) => {
if (timer !== null) window.clearTimeout(timer);
if (immediate && timer === null) fn(...args);
timer = window.setTimeout(() => {
if (!immediate) fn(...args);
timer = null;
}, delay);
};
}
function throttle(fn, delay, immediate = true) {
let lastExecTime = 0;
let timer = null;
return (...args) => {
const now = Date.now();
const timeSinceLastExec = now - lastExecTime;
const execute = () => {
fn(...args);
lastExecTime = now;
};
if (immediate && timeSinceLastExec >= delay) {
execute();
} else if (timer === null) {
timer = window.setTimeout(() => {
if (!immediate || timeSinceLastExec < delay) execute();
timer = null;
}, immediate ? delay - timeSinceLastExec : delay);
}
};
}