在Scheduler.js中,
function unstable_shouldYield() {
return (
!currentDidTimeout &&
((firstCallbackNode !== null &&
firstCallbackNode.expirationTime < currentExpirationTime) ||
shouldYieldToHost())
);
}
当currentDidTimeout为false且shouldYieldToHost()返回true时,stantly_shouldYield()返回true,但是为什么呢?
shouldYieldToHost = function() {
return frameDeadline <= getCurrentTime();
};
shouldYieldToHost()返回true表示在此空闲时间没有剩余时间
currentDidTimeout为false表示计划未超时
它们之间是什么关系,为什么unstable_shouldYield()依赖于它们?
我们每隔16毫秒左右就定期向主机环境发出指令,以使浏览器处理传入的事件(包括用户输入)。 frameDeadline
是我们计划在其产生的时间戳记(最初设置为now() + 16ms
),因此一旦该时间过去,shouldYieldToHost将返回true。 然后,我们使用requestIdleCallback和requestAnimationFrame的某种组合,以便我们可以尽快处理下一个工作。
在理想情况下,我们可以在这些16ms小切片中完成所有渲染。 但是,如果同时发生许多其他事情,React工作可能会“饿死”,并且无法在小片段中完全渲染。 因此,我们进行第二次检查:每个待处理的渲染或状态更新都有一个“到期时间”(通常为100毫秒至5000毫秒)–如果经过该时间而没有完成渲染,我们将切换到同步模式,直到可以完成更新。 这不是理想的方法,但是它确保所有更新都可以得到处理,而不必等待太长时间。
我们在浏览器中为相同的到期时间设置了一个计时器(例如,使用setTimeout)。 如果该计时器触发,我们知道我们需要同步执行工作。 如果发生这种情况,会将currentDidTimeout
设置为true,因此我们不会屈服。
将来,我们计划使用新的isInputPending
浏览器API(https://github.com/WICG/is-input-pending),以便我们可以继续处理工作,并且只有在有新的用户输入时才产生收益,而不是总是每16ms产生一次。
感谢您的回复
我还有问题
unstable_shouldYield()
代表工作是否可以按计划中断,是正确的吗?activeFrameTime
?firstCallbackNode.expirationTime < currentExpirationTime
返回true? 这是否意味着下一项工作的优先级高于上一项?每个渲染任务应经常检查不稳定的_shouldYield()。 (我们在树中的每个组件之后大致称呼它。)在大多数情况下,它将返回false(表示继续进行),但是当返回true时,表示需要暂停渲染。
是的。
我认为,如果在现有渲染期间将一些更新的优先级更高的工作加入队列,则条件是正确的。 在这种情况下,我们要返回true,以便我们可以切换到该任务。
非常感谢您,真是太好了!
最有用的评论
我们每隔16毫秒左右就定期向主机环境发出指令,以使浏览器处理传入的事件(包括用户输入)。
frameDeadline
是我们计划在其产生的时间戳记(最初设置为now() + 16ms
),因此一旦该时间过去,shouldYieldToHost将返回true。 然后,我们使用requestIdleCallback和requestAnimationFrame的某种组合,以便我们可以尽快处理下一个工作。在理想情况下,我们可以在这些16ms小切片中完成所有渲染。 但是,如果同时发生许多其他事情,React工作可能会“饿死”,并且无法在小片段中完全渲染。 因此,我们进行第二次检查:每个待处理的渲染或状态更新都有一个“到期时间”(通常为100毫秒至5000毫秒)–如果经过该时间而没有完成渲染,我们将切换到同步模式,直到可以完成更新。 这不是理想的方法,但是它确保所有更新都可以得到处理,而不必等待太长时间。
我们在浏览器中为相同的到期时间设置了一个计时器(例如,使用setTimeout)。 如果该计时器触发,我们知道我们需要同步执行工作。 如果发生这种情况,会将
currentDidTimeout
设置为true,因此我们不会屈服。将来,我们计划使用新的
isInputPending
浏览器API(https://github.com/WICG/is-input-pending),以便我们可以继续处理工作,并且只有在有新的用户输入时才产生收益,而不是总是每16ms产生一次。