Skip to content

Commit aac3519

Browse files
committed
alternative solution
deferred grouped field sets are only initiated when the WrappedGraphQLResult in which they are contained are processed
1 parent a5e24f0 commit aac3519

File tree

4 files changed

+10
-40
lines changed

4 files changed

+10
-40
lines changed

src/execution/IncrementalGraph.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type { GraphQLError } from '../error/GraphQLError.js';
88
import type {
99
DeferredFragmentRecord,
1010
DeferredGroupedFieldSetRecord,
11-
DeferredGroupedFieldSetResult,
1211
IncrementalDataRecord,
1312
IncrementalDataRecordResult,
1413
ReconcilableDeferredGroupedFieldSetResult,
@@ -201,7 +200,6 @@ export class IncrementalGraph {
201200
for (const node of maybeEmptyNewRootNodes) {
202201
if (isDeferredFragmentRecord(node)) {
203202
if (node.deferredGroupedFieldSetRecords.size > 0) {
204-
node.setAsPending();
205203
for (const deferredGroupedFieldSetRecord of node.deferredGroupedFieldSetRecords) {
206204
if (!this._completesRootNode(deferredGroupedFieldSetRecord)) {
207205
this._onDeferredGroupedFieldSet(deferredGroupedFieldSetRecord);
@@ -253,14 +251,16 @@ export class IncrementalGraph {
253251
private _onDeferredGroupedFieldSet(
254252
deferredGroupedFieldSetRecord: DeferredGroupedFieldSetRecord,
255253
): void {
256-
const result = (
257-
deferredGroupedFieldSetRecord.result as BoxedPromiseOrValue<DeferredGroupedFieldSetResult>
258-
).value;
259-
if (isPromise(result)) {
254+
let deferredGroupedFieldSetResult = deferredGroupedFieldSetRecord.result;
255+
if (!(deferredGroupedFieldSetResult instanceof BoxedPromiseOrValue)) {
256+
deferredGroupedFieldSetResult = deferredGroupedFieldSetResult();
257+
}
258+
const value = deferredGroupedFieldSetResult.value;
259+
if (isPromise(value)) {
260260
// eslint-disable-next-line @typescript-eslint/no-floating-promises
261-
result.then((resolved) => this._enqueue(resolved));
261+
value.then((resolved) => this._enqueue(resolved));
262262
} else {
263-
this._enqueue(result);
263+
this._enqueue(value);
264264
}
265265
}
266266

src/execution/__tests__/defer-test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -986,7 +986,7 @@ describe('Execute: defer directive', () => {
986986
});
987987
});
988988

989-
it('Initiates all deferred grouped field sets immediately once they have been released as pending', async () => {
989+
it('Initiates unique deferred grouped field sets after those that are common to sibling defers', async () => {
990990
const document = parse(`
991991
query {
992992
... @defer {
@@ -1076,7 +1076,7 @@ describe('Execute: defer directive', () => {
10761076
resolveC();
10771077

10781078
expect(cResolverCalled).to.equal(true);
1079-
expect(eResolverCalled).to.equal(true);
1079+
expect(eResolverCalled).to.equal(false);
10801080

10811081
const result3 = await iterator.next();
10821082
expectJSON(result3).toDeepEqual({

src/execution/execute.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,15 +2123,6 @@ function executeDeferredGroupedFieldSets(
21232123
} else {
21242124
deferredGroupedFieldSetRecord.result = () =>
21252125
new BoxedPromiseOrValue(executor());
2126-
const resolveThunk = () => {
2127-
const maybeThunk = deferredGroupedFieldSetRecord.result;
2128-
if (!(maybeThunk instanceof BoxedPromiseOrValue)) {
2129-
deferredGroupedFieldSetRecord.result = maybeThunk();
2130-
}
2131-
};
2132-
for (const deferredFragmentRecord of deferredFragmentRecords) {
2133-
deferredFragmentRecord.onPending(resolveThunk);
2134-
}
21352126
}
21362127

21372128
newDeferredGroupedFieldSetRecords.push(deferredGroupedFieldSetRecord);

src/execution/types.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,6 @@ export class DeferredFragmentRecord {
224224
reconcilableResults: Set<ReconcilableDeferredGroupedFieldSetResult>;
225225
children: Set<SubsequentResultRecord>;
226226

227-
private pending: boolean;
228-
private fns: Array<() => void>;
229-
230227
constructor(
231228
path: Path | undefined,
232229
label: string | undefined,
@@ -238,24 +235,6 @@ export class DeferredFragmentRecord {
238235
this.deferredGroupedFieldSetRecords = new Set();
239236
this.reconcilableResults = new Set();
240237
this.children = new Set();
241-
this.pending = false;
242-
this.fns = [];
243-
}
244-
245-
onPending(fn: () => void): void {
246-
if (this.pending) {
247-
fn();
248-
} else {
249-
this.fns.push(fn);
250-
}
251-
}
252-
253-
setAsPending(): void {
254-
this.pending = true;
255-
let fn;
256-
while ((fn = this.fns.shift()) !== undefined) {
257-
fn();
258-
}
259238
}
260239
}
261240

0 commit comments

Comments
 (0)