Comments (4)
This sounds very similar to this issue, a fix was being worked on for that, but not sure what the status is for that and if it would fix this issue also.
I'm not sure what the difference is with this repro and mine, I didn't look in detail, but in my repro it only occurred with the read function defined, but it sounds like you're having the same issue even without a read function.
from apollo-client.
Hi @oscar60310 👋
Thanks for opening this issue with a clear reproduction of what you're seeing!
First, when I ran your reproduction, I noted that the fetchPolicy
and nextFetchPolicy
had no bearing on the infinite loop behavior, so I commented them out.
Before defining a merge function for it, I expected Apollo to log a warning and replace the value as described in the documentation.
This is indeed what's happening, but for reasons I'll get into below, our two queries are "replacing the value" in an infinite loop, with no way to resolve the feud. First, here's the warning I saw:
Can you confirm you see a similar warning?
The warning notes that Cache data may be lost when replacing the nested field of a Foobar object
and that This could cause additional (usually avoidable) network requests to fetch data that were otherwise cached
.
As you noted, when the Nested
entity can't be normalized, its fields are nested on our cached Foobar:foobar
entity.
The problem arises when QUERY_DATA_1
and QUERY_DATA_2
select non-overlapping fields on this non-normalized entity. In practice, this means that as soon as e.g. QUERY_DATA_1
resolves with foobar.nested.value1
, QUERY_DATA_2
sees that foobar.nested.value2
is missing in the cache, kicking off a network request whose response removes value1
from the cache and replaces it with value2
. QUERY_DATA_1
then "notices" value1
is missing, and the cycle repeats forever.
I think a note in the docs advising against selecting non-overlapping fields on non-normalized objects would be helpful but would love any other ideas/suggestions you have here. Thanks!
from apollo-client.
Hi @alessbell , thanks for the explanation!
Can you confirm you see a similar warning?
The warning notes that Cache data may be lost when replacing the nested field of a Foobar object and that This could cause additional (usually avoidable) network requests to fetch data that were otherwise cached.
Yes, I see the same warning. It makes me think that we might lose the benefit of the cache. In the worst case, each hook would send a single query. However, the consequence is much more critical than simply not using the cache; it could result in infinite requests being sent to our server.
Is it possible to escape from the loop when we detect a cache issue?
I noticed that if we don't have a value that changes with each request, there won't be an infinite loop, and the cache is not replaced (component1 and component2 both get the correct value).
export const QUERY_DATA_1 = gql`
query foobar1 {
foobar {
id
# lastOnlineAt
nested {
value1
}
}
}
`;
2024-06-10.20-50-09.mp4
from apollo-client.
We're experiencing the same thing at Wiz. When the key field is missing accidentally for some object and the object returns two times in a short time with different fields this unexpected behavior happens.
We didn't find it in the docs, we wish we had the option to disable automatic refetching in such cases.
Are there any intentions to solve it?
Thanks
from apollo-client.
Related Issues (20)
- React 19 has updated this SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED HOT 2
- [Data masking] Mask named fragments from data returned from `watchFragment` and `useFragment` HOT 2
- [Data masking] Mask named fragment data returned from mutations HOT 2
- [Data masking] Mask named fragments for data returned from subscriptions HOT 2
- [Data masking] Mask named fragments from data returned in `cache.readQuery` HOT 2
- [Data masking] Mask named fragments for data returned in `cache.readFragment` HOT 2
- [Data masking] Ensure data masking can lookup fragments from the fragment registry HOT 2
- Why does cache read and write operation takes a lot of time when we define client-side variable to a fragment? HOT 3
- [Data masking] Ensure data masking properly handles `null` as top-level, array item, or field with child selection set HOT 2
- [Data masking] Ensure data masking works with `@defer` payloads
- [Data masking] Provide solution for TypeScript type compatibility for APIs that use both the masked result and full result HOT 2
- [Data masking] Warning for field in migrate mode is overagressive
- Websockets can't connect through reverse proxy HOT 2
- useQuery polling query does not stop issuing network requests when the skip argument switches from false to true HOT 3
- `useFragment` does not re-render as expected in v3.11.5 HOT 4
- UseFragment producing a warning during store misses (TypeError: Cannot read properties of undefined) HOT 6
- Cannot read properties of undefined (reading 'data') HOT 18
- Still no alternative to onCompleted change in 3.8 HOT 5
- useSuspenseQuery with skipToken still requires an apolloClient HOT 7
- skip: true and skipToken behave differently with useSuspenseQuery HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from apollo-client.