<button onclick="stopPolling()">停止轮询</button>
<script>
// 全局一个Timeout,创建多个如果没有清理到,会导致程序占用内存过高
let timer = null
polling(1000, 1000, () => 10, (result) => result == 10, 4)
/**
* @param initTime 初始时间、第一次执行时间
* @param step 轮询步长,为0时,每次执行时间都是initTime设置的值,否则为 initTime + step
* @param executor 轮询中要执行的逻辑
* @param handler executor返回值,将在handler中处理
* @param maxCount = 0 最大执行次数,默认不设置最大执行次数
* @param firstTime = true 是否是第一次执行【函数内部使用参数】
* @param count 执行次数【函数内部使用参数】
**/
function polling(initTime, step, executor, handler, maxCount = 0, firstTime = true, count = 0) {
if (!firstTime && (initTime + step > 0)) {
initTime = initTime + step
} else if (initTime + step <= 0) {
throw new Error('Calculation time error')
}
let promise = new Promise((resolve, reject) => {
timer = setTimeout(() => {
let result = executor()
count++
console.log('轮询第' + count + '次执行,时间为' + initTime + 'ms')
resolve(result)
}, initTime)
})
promise.then(value => {
clearTimer()
let doNext = handler(value)
let isMaximum = maxCount === 0 || (maxCount > 0 && count < maxCount)
if (doNext && isMaximum) {
polling(initTime, step, executor, handler, maxCount, false, count)
} else {
console.log('轮询结束');
}
}, value => {
clearTimer()
})
}
/**
* 停止轮询
**/
function stopPolling() {
console.log('停止轮询')
clearTimer()
}
/**
* 清除定时器
**/
function clearTimer() {
if (timer != null) {
clearTimeout(timer)
}
}
</script>
js 轮询器实现
最新推荐文章于 2025-03-13 13:58:25 发布