Fix: Update while suspended fails to interrupt#26739
Merged
acdlite merged 2 commits intofacebook:mainfrom Apr 28, 2023
Merged
Conversation
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This fixes a bug with
usewhere if you update a component that's currently suspended, React will sometimes mistake it for a render phase update.This happens because we don't reset
currentlyRenderingFiberuntil the suspended is unwound. And withuse, that can happen asynchronously, most commonly when the work loop is suspended during a transition.The fix is to make sure
currentlyRenderingFiberis only set when we're in the middle of rendering, which used to be true untilusewas introduced.More specifically this means clearing
currentlyRenderingFiberwhen something throws and setting it again when we resume work.In many cases, this bug will fail "gracefully" because the update is still added to the queue; it's not dropped completely. It's also somewhat rare because it has to be the exact same component that's currently suspended. But it's still a bug. I wrote a regression test that shows a sync update failing to interrupt a suspended component.