From 63fc7c71d1523d6f677f4712787015ecfbf405e1 Mon Sep 17 00:00:00 2001 From: Brian Kim Date: Fri, 27 Aug 2021 11:48:28 -0400 Subject: [PATCH] Fix cached data being returned in getCurrentResult for certain fetch policies Fixes #8697 --- src/core/ObservableQuery.ts | 21 +++++++++++++++------ src/core/__tests__/ObservableQuery.ts | 4 ++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/core/ObservableQuery.ts b/src/core/ObservableQuery.ts index 9bd4808a5fb..b070cdd89c1 100644 --- a/src/core/ObservableQuery.ts +++ b/src/core/ObservableQuery.ts @@ -207,21 +207,30 @@ export class ObservableQuery< networkStatus, } as ApolloQueryResult; - // If this.options.query has @client(always: true) fields, we cannot trust - // diff.result, since it was read from the cache without running local - // resolvers (and it's too late to run resolvers now, since we must return a - // result synchronously). - if (!this.queryManager.transform(this.options.query).hasForcedResolvers) { + const { fetchPolicy = "cache-first" } = this.options; + const shouldReturnCachedData = lastResult || ( + fetchPolicy !== 'network-only' && + fetchPolicy !== 'no-cache' && + fetchPolicy !== 'standby' + ); + if ( + shouldReturnCachedData && + // If this.options.query has @client(always: true) fields, we cannot + // trust diff.result, since it was read from the cache without running + // local resolvers (and it's too late to run resolvers now, since we must + // return a result synchronously). + !this.queryManager.transform(this.options.query).hasForcedResolvers + ) { const diff = this.queryInfo.getDiff(); if (diff.complete || this.options.returnPartialData) { result.data = diff.result; } + if (equal(result.data, {})) { result.data = void 0 as any; } - const { fetchPolicy = "cache-first" } = this.options; if (diff.complete) { // If the diff is complete, and we're using a FetchPolicy that // terminates after a complete cache read, we can assume the next diff --git a/src/core/__tests__/ObservableQuery.ts b/src/core/__tests__/ObservableQuery.ts index 4111121355b..45abeaa2ebe 100644 --- a/src/core/__tests__/ObservableQuery.ts +++ b/src/core/__tests__/ObservableQuery.ts @@ -2027,7 +2027,7 @@ describe('ObservableQuery', () => { }); expect(observable.getCurrentResult()).toEqual({ - data: dataOne, + data: undefined, loading: true, networkStatus: NetworkStatus.loading, }); @@ -2036,7 +2036,7 @@ describe('ObservableQuery', () => { if (handleCount === 1) { expect(subResult).toEqual({ loading: true, - data: dataOne, + data: undefined, networkStatus: NetworkStatus.loading, }); } else if (handleCount === 2) {