any-grid-layout
Version:
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
79 lines (76 loc) • 3.1 kB
JavaScript
/** 所有的DOM操作都通过这个类进行,保证正常拿到DOM对象 */
export default class Sync {
static ready = false
static ins = false
static timeout = 12000 // 默认timeout时间
static intervalTime = 50 // 轮询间隔
constructor() {
Sync.intervalTime = 10
const readystatechange = () => {
Sync.ready = true
Sync.intervalTime = 50
document.removeEventListener('readystatechange',readystatechange)
}
document.addEventListener('readystatechange',readystatechange)
// window.onload = () => Sync.ready = true
}
/** 接受一个函数或者包含obj = {
* func : 执行的函数 , 及时空逻辑也必须传
* callback: 回调函数,回调func的运行结果在 callback 的第一个形参中能拿到
* rule函数 : 是否执行判断规则,返回 true 表示执行func,false不执行,会一直轮询,直到 timeout或者max条件不符合才退出本次func的运行,
* 也可以用于轮询中逻辑操作,以更正运行数据
* timout : timeout 单位ms
* max : 轮询的次数 ,
* intervalTime : 轮询的间隔 ,
* }的对象,
* rule@return boolean函数是执行func的判断条件,直到 返回true 才执行
* */
static init() {
if (!Sync.ins) {
new Sync()
Sync.ins = true
}
}
static run(obj, ...args) { // 等待dom加载完成后执行,无返回值
Sync.init()
let maxCount = 0
let timeout = typeof obj["timeout"] === 'number' ? obj["timeout"] : Sync.timeout
let intervalTime = typeof obj["intervalTime"] === 'number' ? obj["intervalTime"] : Sync.intervalTime
let doSync = () => {
let result
if (typeof obj === "function") result = obj.call(obj, ...args) // 只传入一个函数的情况
else if (typeof obj === "object") { // 对象形式传入
if (!obj["func"]) throw new Error("func函数必须传入")
result = obj["func"].call(obj.func, ...args) || undefined // 通过rule函数校验或者无rule限制情况正常执行
}
if (obj["callback"]) obj["callback"](result)
}
let isObeyRule = () => {
// console.log(Boolean(obj["rule"]));
if (obj["rule"]) {
return obj["rule"]()
}
return Sync.ready
}
if (isObeyRule()) {
doSync()
return true
}
let timer = setInterval(() => {
// 最大次数
if (typeof obj["max"] === 'number' && obj["max"] < maxCount) {
clearInterval(timer)
}
// 超时停止
if (timeout < (maxCount * intervalTime)) {
clearInterval(timer)
}
// 符合条件即运行
if (isObeyRule()) {
clearInterval(timer)
doSync()
}
maxCount++
}, intervalTime)
}
}