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; }); }