总结:
React Scheduler 使用 MessageChannel 的原因为:生成宏任务,实现:
- 将主线程还给浏览器,以便浏览器更新页面。
- 浏览器更新页面后继续执行未完成的任务。
为什么不使用微任务呢?
- 微任务将在页面更新前全部执行完,所以达不到「将主线程还给浏览器」的目的。
为什么不使用 setTimeout(fn, 0)
呢?
- 递归的
setTimeout()
调用会使调用间隔变为 4ms,导致浪费了 4ms。
为什么不使用 rAF()
呢?
- 如果上次任务调度不是
rAF()
触发的,将导致在当前帧更新前进行两次任务调度。 - 页面更新的时间不确定,如果浏览器间隔了 10ms 才更新页面,那么这 10ms 就浪费了。
作者:MoonBall
链接:https://juejin.cn/post/6953804914715803678
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这里加一条看官方解释,然后自己理解的:
为什么不用生成器函数:生成器函数还是会造成性能问题,主要是不能回溯