Scheduler.jsでは、
function unstable_shouldYield() {
return (
!currentDidTimeout &&
((firstCallbackNode !== null &&
firstCallbackNode.expirationTime < currentExpirationTime) ||
shouldYieldToHost())
);
}
現在のDidTimeoutがfalseの場合、unstable_shouldYield()はtrueを返し、shouldYieldToHost()はtrueを返しますが、なぜですか?
shouldYieldToHost = function() {
return frameDeadline <= getCurrentTime();
};
shouldYieldToHost()がtrueを返すということは、このアイドル期間に時間が残っていないことを意味します
currentDidTimeoutがfalseの場合、スケジュールがタイムアウトしていないことを意味します
それらの間にはどのような関係がありますか、unstable_shouldYield()がそれらに依存するのはなぜですか?
ブラウズがユーザー入力を含む着信イベントを処理できるように、定期的に(16ミリ秒ごとに)ホスト環境に譲ります。 frameDeadline
は、生成する予定のタイムスタンプ(元々はnow() + 16ms
ようなものに設定されています)であるため、その時間が経過すると、shouldYieldToHostはtrueを返します。 次に、requestIdleCallbackとrequestAnimationFrameを組み合わせて使用し、次の作業をすぐに処理できるようにします。
理想的なケースでは、これらの小さな16msスライスですべてのレンダリングを終了できます。 ただし、同時に他の多くのことが起こっている場合、Reactの作業は「飢え」、小さなスライスで完全にレンダリングできない可能性があります。 したがって、2番目のチェックがあります。保留中のすべてのレンダリングまたは状態の更新には「有効期限」(通常は100ミリ秒から5000ミリ秒)があります。レンダリングが終了せずにその時間が経過すると、更新が完了するまで同期モードに切り替わります。 これは理想的ではありませんが、すべての更新が長く待たずに処理されることを保証します。
同じ有効期限のタイマーをブラウザーに設定します(たとえば、setTimeoutを使用)。 そのタイマーが起動した場合、作業を同期的に実行する必要があることがわかります。 これが発生した場合、 currentDidTimeout
はtrueに設定されるため、譲歩しません。
将来的には、新しいisInputPending
ブラウザAPI(https://github.com/WICG/is-input-pending)を使用して、作業を続行し、新しいユーザー入力がある場合にのみ譲歩できるようにする予定です。 、常に16msごとに生成するのではなく。
返信ありがとうございます
まだいくつか質問があります、
unstable_shouldYield()
は、スケジュールで作業を中断できるかどうかを表していると思いますが、それは正しいですか?activeFrameTime
指しますか?firstCallbackNode.expirationTime < currentExpirationTime
いつtrueを返しますか? 次の作品の優先順位が前の作品よりも高いということですか?各レンダリングタスクは、unstable_shouldYield()を頻繁にチェックする必要があります。 (ツリー内の各コンポーネントの後に大まかに呼びます。)ほとんどの場合、falseを返します(つまり、続行します)が、trueを返すと、レンダリングを一時停止する必要があります。
はい。
既存のレンダリング中に、より新しい、より優先度の高い作業がキューに入れられた場合、条件は真であると思います。 その場合、そのタスクに切り替えることができるようにtrueを返したいと思います。
本当にありがとうございました!
最も参考になるコメント
ブラウズがユーザー入力を含む着信イベントを処理できるように、定期的に(16ミリ秒ごとに)ホスト環境に譲ります。
frameDeadline
は、生成する予定のタイムスタンプ(元々はnow() + 16ms
ようなものに設定されています)であるため、その時間が経過すると、shouldYieldToHostはtrueを返します。 次に、requestIdleCallbackとrequestAnimationFrameを組み合わせて使用し、次の作業をすぐに処理できるようにします。理想的なケースでは、これらの小さな16msスライスですべてのレンダリングを終了できます。 ただし、同時に他の多くのことが起こっている場合、Reactの作業は「飢え」、小さなスライスで完全にレンダリングできない可能性があります。 したがって、2番目のチェックがあります。保留中のすべてのレンダリングまたは状態の更新には「有効期限」(通常は100ミリ秒から5000ミリ秒)があります。レンダリングが終了せずにその時間が経過すると、更新が完了するまで同期モードに切り替わります。 これは理想的ではありませんが、すべての更新が長く待たずに処理されることを保証します。
同じ有効期限のタイマーをブラウザーに設定します(たとえば、setTimeoutを使用)。 そのタイマーが起動した場合、作業を同期的に実行する必要があることがわかります。 これが発生した場合、
currentDidTimeout
はtrueに設定されるため、譲歩しません。将来的には、新しい
isInputPending
ブラウザAPI(https://github.com/WICG/is-input-pending)を使用して、作業を続行し、新しいユーザー入力がある場合にのみ譲歩できるようにする予定です。 、常に16msごとに生成するのではなく。