-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
subscribeToMore causes the initial request to be refetched #7817
Comments
@geosigno I agree the extra write should not be happening. What |
I don't use any fetchPolicy. It will not be easy to extract that in a repo... I was thinking about adding a "filter" function in the merge that will remove any duplicate, but this would not be very optimal, especially when hundreds/thousands of questions will be refetched.... Any other idea? |
I think the issue is only with the subscribeToMore. Even if i remove the merge part and keep only the subscribeToMore i got the same issue than #6340. |
I'm having this same exact issue, for the same exact use case 😅 Currently looking for the best way to merge and sort the results as a workaround |
I managed to make it work with the below merge config: messageFeed: {
merge(existing, incoming, { readField }) {
const messages = existing ? { ...existing.messages } : {};
incoming.messages.forEach((message) => {
messages[readField("id", message)] = message;
});
return {
cursor: incoming.cursor,
messages,
};
},
read(existing) {
if (existing) {
return {
cursor: existing.cursor,
messages: Object.values(existing.messages),
};
}
},
}, my subscribeToMore updateQuery is as below: updateQuery: (prev, { subscriptionData }) => {
if (!subscriptionData.data) return prev;
const newMessage = subscriptionData.data.message.data;
return Object.assign({}, prev, {
messageFeed: {
messages: [newMessage],
},
});
}, The only issue left I had was that the new message was not on the top of the list. To fix this, I added a sort() function at the place where the questions were returned in the DOM. I hope it will help you, let me know if anything is unclear. And hopefully, this phantom request will be fixed very soon. |
Thanks for that @geosigno. I was able to determine if the request was triggered by a |
I've found a way to (for me at least) avoid the phantom request here, although it does still run the merge function after the subscription fires.
By using |
Maybe related to #6916 |
In a situation without a pagination to deal with, setting |
@LovingGarlic Would you mind share the code here? |
Essentially it's something like this:
Note in the second conditional, that I check for the existence of a |
I am too getting the phantom request after subscribeToMore is called. Is anyone working on fixing this ? |
Hi folks 👋 Is anyone able to provide a runnable reproduction here? We have a CodeSandbox that mirrors a forkable GitHub repo where you'll find a |
Hey all 👋 Since we haven't had a reproduction of this issue in a while, we're going to go ahead and close this. Please open a new issue with a reproduction if you are still experiencing this behavior. Thanks! |
Do you have any feedback for the maintainers? Please tell us by taking a one-minute survey. Your responses will help us understand Apollo Client usage and allow us to serve you better. |
Hello,
I'm setting up a quite simple message feed on my app. There is an infinite scroll that uses the fetchMore function with a cursor pagination logic and a subscribeToMore to listen for new messages.
I can succeed to make the apollo working for fetching more OR subscription but not for both...
This is my initial query:
This is my merging function:
So if I stop here, it is working fine. The merging is well executed and I got an infinite flow of messages while I'm scrolling down.
Here come the subscription and the issues...
This is my subscribeToMore function:
When a new message is posted, here what happening on the DOM:
initial 20 first messages
new message from the subscription
again initial 20 first messages
When debugging, I noticed the merge function is called twice.
First call (when the subscription is fired)
existing => the first 20 messages already displayed in the DOM
incoming => the new message from the subscription
merge => the two are merged and the 21 messages are well returned.
It should stop here.
BUT then, a new graphql post (with the same variables as the initial request at page load) is coming from nowhere which cause the merge function to be called again:
existing => the 21 messages already displayed in the DOM
incoming => the same 20 messages as the initial request
merge => the two are merge and the 41 and returning (including 20 duplicates)
Any idea from where is coming that second call?
The text was updated successfully, but these errors were encountered: