Skip to content

Commit 2c5a626

Browse files
committed
EPR collectAndExecuteSubfields, executeFieldsSerially, executeFields
1 parent 4387ccd commit 2c5a626

File tree

1 file changed

+39
-64
lines changed

1 file changed

+39
-64
lines changed

src/execution/execute.js

Lines changed: 39 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -440,13 +440,11 @@ function executeOperation(
440440
: executeFields(exeContext, type, rootValue, path, fields);
441441
const promise = getPromise(result);
442442
if (promise) {
443-
return promise
444-
.then(resolved => ({ data: resolved }))
445-
.then(undefined, error =>
446-
mergeErrors(exeContext, { data: null, errors: [error] }),
447-
);
443+
return promise.then(undefined, error =>
444+
mergeErrors(exeContext, { data: null, errors: [error] }),
445+
);
448446
}
449-
return mergeErrors(exeContext, { data: result });
447+
return mergeErrors(exeContext, result);
450448
} catch (error) {
451449
return mergeErrors(exeContext, { data: null, errors: [error] });
452450
}
@@ -503,40 +501,36 @@ function executeFieldsSerially(
503501
sourceValue: mixed,
504502
path: ResponsePath | void,
505503
fields: ObjMap<Array<FieldNode>>,
506-
): Promise<ObjMap<mixed>> {
507-
return Object.keys(fields).reduce(
508-
(prevPromise, responseName) =>
509-
prevPromise.then(results => {
510-
const fieldNodes = fields[responseName];
511-
const fieldPath = addPath(path, responseName);
512-
const result = resolveField(
513-
exeContext,
514-
parentType,
515-
sourceValue,
516-
fieldNodes,
517-
fieldPath,
518-
);
519-
if (result === null) {
520-
return results;
521-
}
522-
const promise = getPromise(result);
523-
if (promise) {
524-
return promise.then(resolvedResult => {
525-
if (resolvedResult.errors && resolvedResult.errors.length) {
526-
exeContext.errors.push.apply(exeContext.errors, resolvedResult.errors);
527-
}
528-
results[responseName] = resolvedResult.data;
504+
): ExecutionPartialResult<mixed> {
505+
return Object.keys(fields)
506+
.reduce(
507+
(prevPromise, responseName) =>
508+
prevPromise.then(results => {
509+
const fieldNodes = fields[responseName];
510+
const fieldPath = addPath(path, responseName);
511+
const result = resolveField(
512+
exeContext,
513+
parentType,
514+
sourceValue,
515+
fieldNodes,
516+
fieldPath,
517+
);
518+
if (result === null) {
529519
return results;
530-
});
531-
}
532-
if (result.errors && result.errors.length) {
533-
exeContext.errors.push.apply(exeContext.errors, result.errors);
534-
}
535-
results[responseName] = result.data;
536-
return results;
537-
}),
538-
Promise.resolve({}),
539-
);
520+
}
521+
const promise = getPromise(result);
522+
if (promise) {
523+
return promise.then(resolvedResult => {
524+
results[responseName] = resolvedResult;
525+
return results;
526+
});
527+
}
528+
results[responseName] = result;
529+
return results;
530+
}),
531+
Promise.resolve({}),
532+
)
533+
.then(finalResults => mergeEPRs(finalResults));
540534
}
541535

542536
/**
@@ -549,7 +543,7 @@ function executeFields(
549543
sourceValue: mixed,
550544
path: ResponsePath | void,
551545
fields: ObjMap<Array<FieldNode>>,
552-
): MaybePromise<ObjMap<mixed>> {
546+
): ExecutionPartialResult<mixed> {
553547
let containsPromise = false;
554548

555549
const finalResults = Object.keys(fields).reduce((results, responseName) => {
@@ -574,23 +568,14 @@ function executeFields(
574568

575569
// If there are no promises, we can just return the object
576570
if (!containsPromise) {
577-
const merged = mergeEPRs(finalResults);
578-
if (merged.errors && merged.errors.length) {
579-
exeContext.errors.push.apply(exeContext.errors, merged.errors);
580-
}
581-
return merged.data;
571+
return mergeEPRs(finalResults);
582572
}
583573

584574
// Otherwise, results is a map from field name to the result
585575
// of resolving that field, which is possibly a promise. Return
586576
// a promise that will return this same map, but with any
587577
// promises replaced with the values they resolved to.
588-
return promiseForObject(finalResults).then(merged => {
589-
if (merged.errors && merged.errors.length) {
590-
exeContext.errors.push.apply(exeContext.errors, merged.errors);
591-
}
592-
return merged.data;
593-
});
578+
return promiseForObject(finalResults);
594579
}
595580

596581
function mergeEPRs(
@@ -1283,19 +1268,14 @@ function completeObjectValue(
12831268
if (!isTypeOfResult) {
12841269
throw invalidReturnTypeError(returnType, result, fieldNodes);
12851270
}
1286-
const data = collectAndExecuteSubfields(
1271+
return collectAndExecuteSubfields(
12871272
exeContext,
12881273
returnType,
12891274
fieldNodes,
12901275
info,
12911276
path,
12921277
result,
12931278
);
1294-
const subpromise = getPromise(data);
1295-
if (subpromise) {
1296-
return subpromise.then(d => ({ data: d }));
1297-
}
1298-
return { data };
12991279
});
13001280
}
13011281

@@ -1304,19 +1284,14 @@ function completeObjectValue(
13041284
}
13051285
}
13061286

1307-
const subfields = collectAndExecuteSubfields(
1287+
return collectAndExecuteSubfields(
13081288
exeContext,
13091289
returnType,
13101290
fieldNodes,
13111291
info,
13121292
path,
13131293
result,
13141294
);
1315-
const subfpromise = getPromise(subfields);
1316-
if (subfpromise) {
1317-
return subfpromise.then(d => ({ data: d }));
1318-
}
1319-
return { data: subfields };
13201295
}
13211296

13221297
function invalidReturnTypeError(
@@ -1337,7 +1312,7 @@ function collectAndExecuteSubfields(
13371312
info: GraphQLResolveInfo,
13381313
path: ResponsePath,
13391314
result: mixed,
1340-
): mixed {
1315+
): ExecutionPartialResult<mixed> {
13411316
// Collect sub-fields to execute to complete this value.
13421317
let subFieldNodes = Object.create(null);
13431318
const visitedFragmentNames = Object.create(null);

0 commit comments

Comments
 (0)