对于 React Scheduler,它通过将任务切片并异步执行,避免了阻塞浏览器的主线程。
很多人其实都看到过类似的文章了,甚至说去手写调度器,都写的很不错,所以本文将从一个新的角度探讨 React Scheduler,揭示它是如何利用几个简单的 API 实现这一壮举的。
React Scheduler 解析首先,让我们回顾一下浏览器的任务类型:宏任务和微任务,以及它们是如何在事件循环中执行的。

在浏览器的一次事件循环中,包括宏任务、微任务和页面渲染三个部分。如果我们假设屏幕的刷新率是 60FPS,那么大约每 16ms 就会执行一次事件循环。
这 16ms 内我们还要留些事件给浏览器处理页面渲染。而剩余的时间我们就需要尽可能的充分利用。
那么我们怎么知道还剩多少空余时间呢,可以使用 requestIdleCallback 方法,它会插入一个函数,并在浏览器空闲的时候执行,同时传入一个参数包含剩下的空余时间。
但是实际上并没有去使用 requestIdleCallback 去处理,为什么没有使用 requestIdleCallback 去实现呢?
兼容性问题
虽然大部分主流浏览器都支持该方法,但是 Safari 等部分浏览器却仍不支持。
不确定性
requestIdleCallback 只会在浏览器空闲的时候去调用,这意味着它的执行有很大的不确定性,有可能会有较高的延迟。这对于一些高响应的任务,是没办法处理的。
一致性
requestIdleCallback 属于浏览器 API,脱离了浏览器之后没办法使用。
有了这个时间,我们就可以去执行空余时间这么长的任务了,但是我们怎么去确定我们的任务去执行多长时间呢?