分时函数封装【JavaScript】

JavaScript分时任务封装技巧

抛出问题

现象:假如页面上有一个按钮,点击之后向页面上添加100000个元素,造成卡顿效果。

原因:意思就是假如有很多任务排队执行,现在造成卡顿,为什么会卡顿呢?是因为有渲染帧存在,现在有一个长任务执行,导致渲染帧被迫延后了。

解决:如何解决呢?不能一次性把任务全部执行完,需要分布去处理。

    <button class="btn">插入100000个元素</button>
    <script>
        const tasks = Array.from({ length: 100000 }, (_, i) => () => {
            const div = document.createElement("div")
            div.innerText = i
            document.body.appendChild(div)
        })
        let btn = document.querySelector(".btn")

        btn.onclick = () => {
            performTask(tasks, schedule)
        }
    </script>

封装通用性performTask函数

首先需要考虑这个函数的执行时机是什么,其次就是每一次执行的量是多少

我们可以传递一个schedule调度器函数,在这个函数中传递执行时机。

例如:

        btn.onclick = () => {
            const schedule = (runChunk) => {
                let count = 0
                setTimeout(() => {
                    runChunk(() => count++ < 3)
                }, 1000);
            }
            performTask(tasks, schedule)
        }

schedule函数中接受需要执行的任务runChunk,执行时机是1000ms执行一次,执行量是一个函数

每一次执行3次。

        function performTask(tasks, schedule) {
            // 何时执行下一步
            // 每一步的执行量
            let index = 0
            function _run() {
                schedule((isGoOn) => {
                    while (index < tasks.length && isGoOn()) {
                        tasks[index++]()
                    }
                    if (index < tasks.length) {
                        _run()
                    }
                })
            }
            _run()
        }

封装通用性idlePerformTask函数

在我们的浏览器中,我们希望执行的时机是在每一帧渲染后剩余的空闲时间来执行我们的任务,

执行量就是空闲时间内执行的数量。

所以我们可以调用requestIdleCallback在浏览器空闲的时间执行任务。

        function idlePerformTask(tasks) {
            performTask(tasks, (runChunk) => {
                requestIdleCallback((idle) => {
                    runChunk(() => idle.timeRemaining() > 0)
                })
            })
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值