js 轮询器实现

<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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值