React: 在什么情况下,unstable_shouldYield将返回true?

创建于 2019-02-08  ·  4评论  ·  资料来源: facebook/react

在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()依赖于它们?

Question

最有用的评论

我们每隔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产生一次。

所有4条评论

我们每隔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产生一次。

感谢您的回复
我还有问题

  1. 我认为unstable_shouldYield()代表工作是否可以按计划中断,是正确的吗?
  2. “ 16ms”是否指的是activeFrameTime
  3. firstCallbackNode.expirationTime < currentExpirationTime返回true? 这是否意味着下一项工作的优先级高于上一项?
  1. 每个渲染任务应经常检查不稳定的_shouldYield()。 (我们在树中的每个组件之后大致称呼它。)在大多数情况下,它将返回false(表示继续进行),但是当返回true时,表示需要暂停渲染。

  2. 是的。

  3. 我认为,如果在现有渲染期间将一些更新的优先级更高的工作加入队列,则条件是正确的。 在这种情况下,我们要返回true,以便我们可以切换到该任务。

非常感谢您,真是太好了!

此页面是否有帮助?
0 / 5 - 0 等级