I'm completely stuck on an Apollo problem, for which I've opened a GitHub issue and had zero response on.
I'm calling an Apollo mutation, using optimisticResponse
. The way it's supposed to work, as I understand it, is that update()
gets called twice: first with the optimistic data, then again with the actual data coming in from the network.
But for some reason, my code is not working like this. I'm getting two update()
calls, both with the optimistic data.
Here's a repo that demonstrates this behavior: https://github.com/ffxsam/apollo-update-bug
If a mutation updates a single existing entity, Apollo Client can automatically update that entity's value in its cache when the mutation returns. To do so, the mutation must return the id of the modified entity, along with the values of the fields that were modified.
Refetching is especially common after a mutation, so mutate functions accept options like refetchQueries and onQueryUpdated to specify which queries should be refetched, and how. To selectively refetch queries outside of a mutation, you instead use the refetchQueries method of ApolloClient , which is documented here.
Calling the mutate function returned by the hook returns a Promise. If the request is successful, the Promise will resolve to a response object that includes the data returned by the server. If the request fails, the Promise will reject with the error.
I was doing some digging and I think I found the source of the problem. Unfortunately, I don't have a solution.
In short, the problem might be with a network link called OfflineLink
that is used by aws-appsync
.
aws-appsync
has an ApolloLink called OfflineLink
that intervenes with the request
function.
What happens is something like this:
$apollo.mutate(...)
ApolloClient.QueryManager
initializes the mutation that triggers your update
the first time with the optimistic response. That is happening inside ApolloClient data store, markMutationInit calls markMutationResult that calls your update.OfflineLink
in the network chain.OfflineLink
creates a new observer and dispatches the mutation info as an action.OfflineLink
calls the observer's next
function with the optimisticResponse
as if it was the execution result!
update
the second time with the result which is actually the optimisticResponse
.OfflineLink
calls the observer's complete
which resolves your promise.console.log('done!'...
Meanwhile, OfflineLink
prevents the original mutation from even sending the request, and a new mutation is generated and sent with the options you've given it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With