[6.x] Deduplicate RelationshipInput in-flight item-data requests#14590
Merged
jasonvarga merged 4 commits into6.xfrom May 1, 2026
Merged
[6.x] Deduplicate RelationshipInput in-flight item-data requests#14590jasonvarga merged 4 commits into6.xfrom
jasonvarga merged 4 commits into6.xfrom
Conversation
Co-authored-by: Waldemar Pankratz <waldemar.pankratz@voll.digital>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 is one part from #14512
When the RelationshipInput component fires off requests to get item data, if there are multiple fields with the same value they would make identical requests. This could happen when there's a replicator with many of the same repeated subfield.
This change deduplicates concurrent requests so siblings share a single in-flight promise, and keeps that promise alive as long as anyone is still listening.
inFlightRequestsMap. Each entry holds the shared promise, anAbortController, and a subscriber count. The cache key is a JSON-encoded[itemDataUrl, site, sortedSelections].detachFromInFlightRequesthelper decrements the count on unmount, navigation, or selection change. The sharedAbortControlleronly fires when the count reaches zero — so a leader changing selections or unmounting no longer cancels the request out from under followers..then/.catch/.finallyis gated onthis._activeRequest === entry, so a component that has moved on to a new selection won't emit stale data or clearloadingfor an outdated request.