apollo-client
apollo-client copied to clipboard
The `onCompleted` callback of `useQuery` executes from cache writes.
Intended outcome:
The onCompleted option provided to useQuery should not be called after data was changed from an update via cache.writeQuery (where it was just a local cache update without a network request).
Actual outcome:
When using cache.writeQuery to update local data, the onCompleted option of a useQuery for the same query gets called. This is a change from what we see on 3.4.x, where the onCompleted callback is not called after these cache updates.
How to reproduce the issue:
https://github.com/lawrence-yu/react-apollo-error-onCompleted
- After having it running locally, click on the button with "Update person's name via writeQuery". This does a cache write to append a
1to a person's name, which is reflected in UI with the list of names. - In 3.6.8, note that the "onCompleted count" increases with each button click / cache write.
- There's a
3.4.17branch in the fork that can be used to see that, with each button click, theonCompletedcount remains at 1 (the one being from after initial query completion).
- There's a
Versions
System:
OS: Windows 10 10.0.19042
Binaries:
Node: 16.13.2 - C:\Program Files\nodejs\node.EXE
Yarn: 1.22.18 - ~\.yarn\bin\yarn.CMD
npm: 8.1.2 - C:\Program Files\nodejs\npm.CMD
Browsers:
Edge: Spartan (44.19041.1266.0), Chromium (105.0.1343.27)
npmPackages:
@apollo/client: ^3.6.8 => 3.6.8
Other notes
The limited documentation for the onCompleted option leaves me unsure about what is the "correct" behavior. Is getting called by cache updates actually correct now? Or was the old behavior correct and this is an actual bug?
Potentially related to: #9688 #10059
As you suspected, this is very likely the same underlying issue as https://github.com/apollographql/apollo-client/issues/10059.
Hi @bignimbus, I'm quite confused about your comment and how it relates to my issue. Is it possible your comment/issue-close here was meant for a different issue?
I see you had a recent docs PR here, https://github.com/apollographql/apollo-client/pull/10066/files, but with that I still don't see how it relates to my ask here.
You're quite right @lawrence-yu, sorry for the confusion! I've deleted the comment and will repost it where it belongs.
Seems we have the same error:
- we call
queryon a button click viauseLazyQuerythat lazily checks GQLoperationby queryingoperationfield usingnetwork-onlyfetch policy. - if
queryis completed successfully and the operation is enabled, we callmutationthat updates data and returns the sameoperationfield. Operation is disabled in this case, because we updated the data. - after the
mutationis finished and its result is written to the cache,onCompletedcallback ofqueryis triggered automatically
Same problem here, And Im using Apollo 3.6.9
Thanks for the reproduction, @lawrence-yu!
https://github.com/apollographql/apollo-client/pull/10229 is open with the fix, I'll update this issue again when it's merged and released 🙇♀️
The fix is now available in the current 3.8 alpha release which can be installed via npm i @apollo/client@alpha.
Hi all - I'm going to close this issue out since this is fixed in a prerelease. Feel free to install the latest alpha with the command above. Thanks!
This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs. For general questions, we recommend using StackOverflow or our discord server.