Skip to content

Commit

Permalink
Check if there's a partial tree before restarting
Browse files Browse the repository at this point in the history
If a partial render expires, we should stay in the concurrent path
(performConcurrentWorkOnRoot); we'll stop yielding, but the rest of the
behavior remains the same.

We will only revert to the sync path (performSyncWorkOnRoot) when
starting on a new level.

This approach prevents partially completed concurrent work from
being discarded.
  • Loading branch information
acdlite committed Jan 29, 2020
1 parent 36bf07f commit 7c100bf
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions packages/react-reconciler/src/ReactFiberWorkLoop.js
Original file line number Diff line number Diff line change
Expand Up @@ -644,9 +644,16 @@ function performConcurrentWorkOnRoot(root, didTimeout) {
// event time. The next update will compute a new event time.
currentEventTime = NoWork;

if (didTimeout) {
// The render task took too long to complete. Mark the current time as
// expired to synchronously render all expired work in a single batch.
// Check if the render expired. If so, restart at the current time so that we
// can finish all the expired work in a single batch. However, we should only
// do this if we're starting a new tree. If we're in the middle of an existing
// tree, we'll continue working on that (without yielding) so that the work
// doesn't get dropped. If there's another expired level after that, we'll hit
// this path again, at which point we can batch all the subsequent levels
// together.
if (didTimeout && workInProgress === null) {
// Mark the current time as expired to synchronously render all expired work
// in a single batch.
const currentTime = requestCurrentTimeForUpdate();
markRootExpiredAtTime(root, currentTime);
// This will schedule a synchronous callback.
Expand Down

0 comments on commit 7c100bf

Please sign in to comment.