diff --git a/CHANGELOG.md b/CHANGELOG.md
index b537c6f270f..7353ae2483e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,9 @@
- Avoid updating (and later invalidating) cache watches when `fetchPolicy` is `'no-cache'`.
[@bradleyayers](https://github.com/bradleyayers) in [PR #4573](https://github.com/apollographql/apollo-client/pull/4573), part of [issue #3452](https://github.com/apollographql/apollo-client/issues/3452)
+- Remove temporary `queryId` after `fetchMore` completes.
+ [@doomsower](https://github.com/doomsower) in [#4440](https://github.com/apollographql/apollo-client/pull/4440)
+
### Apollo Cache In-Memory
- Support `new InMemoryCache({ freezeResults: true })` to help enforce immutability.
diff --git a/packages/apollo-client/src/__tests__/fetchMore.ts b/packages/apollo-client/src/__tests__/fetchMore.ts
index f196e2e45ef..602004cff3c 100644
--- a/packages/apollo-client/src/__tests__/fetchMore.ts
+++ b/packages/apollo-client/src/__tests__/fetchMore.ts
@@ -473,6 +473,41 @@ describe('fetchMore on an observable query', () => {
},
});
});
+
+ it('will not leak fetchMore query', () => {
+ latestResult = null;
+ var beforeQueryCount;
+ return setup({
+ request: {
+ query,
+ variables: variablesMore,
+ },
+ result: resultMore,
+ })
+ .then(watchedQuery => {
+ beforeQueryCount = Object.keys(
+ client.queryManager.queryStore.getStore(),
+ ).length;
+ return watchedQuery.fetchMore({
+ variables: { start: 10 }, // rely on the fact that the original variables had limit: 10
+ updateQuery: (prev, options) => {
+ const state = cloneDeep(prev) as any;
+ state.entry.comments = [
+ ...state.entry.comments,
+ ...(options.fetchMoreResult as any).entry.comments,
+ ];
+ return state;
+ },
+ });
+ })
+ .then(data => {
+ var afterQueryCount = Object.keys(
+ client.queryManager.queryStore.getStore(),
+ ).length;
+ expect(afterQueryCount).toBe(beforeQueryCount);
+ unsetup();
+ });
+ });
});
describe('fetchMore on an observable query with connection', () => {
diff --git a/packages/apollo-client/src/core/ObservableQuery.ts b/packages/apollo-client/src/core/ObservableQuery.ts
index b39cb647d42..fd54b11d745 100644
--- a/packages/apollo-client/src/core/ObservableQuery.ts
+++ b/packages/apollo-client/src/core/ObservableQuery.ts
@@ -343,11 +343,10 @@ export class ObservableQuery<
);
let combinedOptions: any;
+ const qid = this.queryManager.generateQueryId();
return Promise.resolve()
.then(() => {
- const qid = this.queryManager.generateQueryId();
-
if (fetchMoreOptions.query) {
// fetch a new query
combinedOptions = fetchMoreOptions;
@@ -381,7 +380,13 @@ export class ObservableQuery<
}),
);
+ this.queryManager.stopQuery(qid);
+
return fetchMoreResult as ApolloQueryResult;
+
+ }, error => {
+ this.queryManager.stopQuery(qid);
+ throw error;
});
}