zlx362211854 / daily-study

每日一个知识点总结,以issue的形式体现
10 stars 6 forks source link

90. requestIdleCallback #145

Open goldEli opened 4 years ago

goldEli commented 4 years ago

说说 requestIdleCallback 有什么用,怎么用?

goldEli commented 4 years ago

从这个 API 的字面意思就可以理解,询问浏览器的时间安排,浏览器会告诉你,未来多少秒是空闲的

假如你的操作要1秒,浏览器告诉你它未来空余时间大于1秒,那么你就可以执行你的操作。

这样做的好处就是不会造成浏览器主线程阻塞,用户就不会感受到动画,操作卡顿等不好的体验。

React 就是利用这个API实现暂停渲染,为高优先级操作让出主线线程,如下代码:

function callback(timeline) {
    // 询问浏览器是否空闲
    if (timeline.timeRemaining()>1) {
        /**
            React 利用 fiber 数据结构将渲染分成多个任务每次执行一个
        */
        // 获取一个渲染任务
        const unitOfWork = getUnitOfWork()
        // 执行渲染任务
        excuteUnitOfWork(unitOfWork)
    }
    window.requestIdleCallback(callback)
}

window.requestIdleCallback(callback)
nanslee commented 4 years ago
zlx362211854 commented 4 years ago

requestIdleCallback可以监听浏览器状态,当浏览器空闲的时候,会执行传入的回调函数:

    requestIdleCallback(myNonEssentialWork);
    let start = new Date().valueOf()
    while (new Date().valueOf() - start < 5000) {
      // 占用5秒
    }
    function myNonEssentialWork (deadline) {
      console.log(deadline.timeRemaining(), 'deadline.timeRemaining()')

      // if (tasks.length > 0){
      //   requestIdleCallback(myNonEssentialWork);
      // }
    }

如上,如果我们一直占用浏览器5秒,那么5秒后,回调函数会被执行,告诉我们,现在浏览器处于空闲状态。