luoyang-screen/src/page/Component/ScrollBoard/util/index.ts
2024-08-19 14:44:16 +08:00

115 lines
2.7 KiB
TypeScript

export function co(gen: any) {
let destroyed = false;
// 处理 return 之后 resume 的问题
let stop = false;
let val: any = null;
if (typeof gen === "function") gen = gen();
if (!gen || typeof gen.next !== "function") return () => ({});
Promise.resolve().then(() => {
destroyed || next(gen.next());
});
return {
end() {
destroyed = true;
Promise.resolve().then(() => {
gen.return();
gen = null;
});
},
pause() {
if (!destroyed) {
stop = true;
}
},
resume() {
const oldVal = val;
if (!destroyed && stop) {
stop = false;
Promise.resolve(val).then(function () {
if (!destroyed && !stop && oldVal === val) {
next(gen.next());
}
});
}
},
};
function next(ret: any) {
if (ret.done) return ret.value;
val = ret.value;
return Promise.resolve(ret.value).then(() => {
!destroyed && !stop && next(gen.next());
});
}
}
/**
* @description 将函数转成防抖动函数
* @param {Function} 需要转成防抖动函数的函数
* @param {number} 延迟时间(毫秒数)
* @param {boolean} 是否执行第一次
* @return {undefined} 无返回值
*/
export function debounce(fn: any, delay = 600, runFirstFn = true) {
let timer: any = null;
return function (this: any, ...rest: any) {
// 清除定时器
clearTimeout(timer);
if (runFirstFn) {
fn.apply(this, rest);
runFirstFn = false;
return;
}
// 设置定时器
timer = setTimeout(fn.bind(this, ...rest), delay);
};
}
export function observerDomResize(dom: any, callback: any) {
const MutationObserver = window.MutationObserver;
// window.WebKitMutationObserver ||
// window.MozMutationObserver;
const observer = new MutationObserver(callback);
observer.observe(dom, {
attributes: true,
attributeFilter: ["style"],
attributeOldValue: true,
});
return observer;
}
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _util = require("./../util/utils");
export function deepMerge(target: any, merged: any) {
for (var key in merged) {
if (target[key] && _typeof2["default"](target[key]) === "object") {
deepMerge(target[key], merged[key]);
continue;
}
if (_typeof2["default"](merged[key]) === "object") {
target[key] = _util.deepClone(merged[key], true);
continue;
}
target[key] = merged[key];
}
return target;
}