Fix race condition during multiple simultaneous unregisters #4
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 is an actual case from our project.
Let's pretend we have a list with items, that could have popovers. For each item we render popover with prop
isVisible
set tofalse
. Then we actually show one of them, and by click on it, we unmount the whole list.Because of the hook in the Popover we will get a lot of simultaneous calls to a PopoverContainer to unregister components, and it could lead to race condition as
setState
may be asynchronous.But usage of
setState
with a callback parameter is guarantee that an actual state will be used at each point.In our case the race condition is happen consistently with a list that is unmounted completely after interaction with a popover, especially if it was a first popover in a list (remember we render it with items), because all other items, just get a copy of state without the removed item and the popover just stays in the registry.