Skip to content

Commit ed16b51

Browse files
committed
EPR collectAndExecuteSubfields, executeFieldsSerially, executeFields
1 parent 5ea3fde commit ed16b51

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
@@ -435,13 +435,11 @@ function executeOperation(
435435
: executeFields(exeContext, type, rootValue, path, fields);
436436
const promise = getPromise(result);
437437
if (promise) {
438-
return promise
439-
.then(resolved => ({ data: resolved }))
440-
.then(undefined, error =>
441-
mergeErrors(exeContext, { data: null, errors: [error] }),
442-
);
438+
return promise.then(undefined, error =>
439+
mergeErrors(exeContext, { data: null, errors: [error] }),
440+
);
443441
}
444-
return mergeErrors(exeContext, { data: result });
442+
return mergeErrors(exeContext, result);
445443
} catch (error) {
446444
return mergeErrors(exeContext, { data: null, errors: [error] });
447445
}
@@ -498,40 +496,36 @@ function executeFieldsSerially(
498496
sourceValue: mixed,
499497
path: ResponsePath | void,
500498
fields: ObjMap<Array<FieldNode>>,
501-
): Promise<ObjMap<mixed>> {
502-
return Object.keys(fields).reduce(
503-
(prevPromise, responseName) =>
504-
prevPromise.then(results => {
505-
const fieldNodes = fields[responseName];
506-
const fieldPath = addPath(path, responseName);
507-
const result = resolveField(
508-
exeContext,
509-
parentType,
510-
sourceValue,
511-
fieldNodes,
512-
fieldPath,
513-
);
514-
if (result === null) {
515-
return results;
516-
}
517-
const promise = getPromise(result);
518-
if (promise) {
519-
return promise.then(resolvedResult => {
520-
if (resolvedResult.errors && resolvedResult.errors.length) {
521-
exeContext.errors.push.apply(exeContext.errors, resolvedResult.errors);
522-
}
523-
results[responseName] = resolvedResult.data;
499+
): ExecutionPartialResult<mixed> {
500+
return Object.keys(fields)
501+
.reduce(
502+
(prevPromise, responseName) =>
503+
prevPromise.then(results => {
504+
const fieldNodes = fields[responseName];
505+
const fieldPath = addPath(path, responseName);
506+
const result = resolveField(
507+
exeContext,
508+
parentType,
509+
sourceValue,
510+
fieldNodes,
511+
fieldPath,
512+
);
513+
if (result === null) {
524514
return results;
525-
});
526-
}
527-
if (result.errors && result.errors.length) {
528-
exeContext.errors.push.apply(exeContext.errors, result.errors);
529-
}
530-
results[responseName] = result.data;
531-
return results;
532-
}),
533-
Promise.resolve({}),
534-
);
515+
}
516+
const promise = getPromise(result);
517+
if (promise) {
518+
return promise.then(resolvedResult => {
519+
results[responseName] = resolvedResult;
520+
return results;
521+
});
522+
}
523+
results[responseName] = result;
524+
return results;
525+
}),
526+
Promise.resolve({}),
527+
)
528+
.then(finalResults => mergeEPRs(finalResults));
535529
}
536530

537531
/**
@@ -544,7 +538,7 @@ function executeFields(
544538
sourceValue: mixed,
545539
path: ResponsePath | void,
546540
fields: ObjMap<Array<FieldNode>>,
547-
): MaybePromise<ObjMap<mixed>> {
541+
): ExecutionPartialResult<mixed> {
548542
let containsPromise = false;
549543

550544
const finalResults = Object.keys(fields).reduce((results, responseName) => {
@@ -569,23 +563,14 @@ function executeFields(
569563

570564
// If there are no promises, we can just return the object
571565
if (!containsPromise) {
572-
const merged = mergeEPRs(finalResults);
573-
if (merged.errors && merged.errors.length) {
574-
exeContext.errors.push.apply(exeContext.errors, merged.errors);
575-
}
576-
return merged.data;
566+
return mergeEPRs(finalResults);
577567
}
578568

579569
// Otherwise, results is a map from field name to the result
580570
// of resolving that field, which is possibly a promise. Return
581571
// a promise that will return this same map, but with any
582572
// promises replaced with the values they resolved to.
583-
return promiseForObject(finalResults).then(merged => {
584-
if (merged.errors && merged.errors.length) {
585-
exeContext.errors.push.apply(exeContext.errors, merged.errors);
586-
}
587-
return merged.data;
588-
});
573+
return promiseForObject(finalResults);
589574
}
590575

591576
function mergeEPRs(
@@ -1278,19 +1263,14 @@ function completeObjectValue(
12781263
if (!isTypeOfResult) {
12791264
throw invalidReturnTypeError(returnType, result, fieldNodes);
12801265
}
1281-
const data = collectAndExecuteSubfields(
1266+
return collectAndExecuteSubfields(
12821267
exeContext,
12831268
returnType,
12841269
fieldNodes,
12851270
info,
12861271
path,
12871272
result,
12881273
);
1289-
const subpromise = getPromise(data);
1290-
if (subpromise) {
1291-
return subpromise.then(d => ({ data: d }));
1292-
}
1293-
return { data };
12941274
});
12951275
}
12961276

@@ -1299,19 +1279,14 @@ function completeObjectValue(
12991279
}
13001280
}
13011281

1302-
const subfields = collectAndExecuteSubfields(
1282+
return collectAndExecuteSubfields(
13031283
exeContext,
13041284
returnType,
13051285
fieldNodes,
13061286
info,
13071287
path,
13081288
result,
13091289
);
1310-
const subfpromise = getPromise(subfields);
1311-
if (subfpromise) {
1312-
return subfpromise.then(d => ({ data: d }));
1313-
}
1314-
return { data: subfields };
13151290
}
13161291

13171292
function invalidReturnTypeError(
@@ -1332,7 +1307,7 @@ function collectAndExecuteSubfields(
13321307
info: GraphQLResolveInfo,
13331308
path: ResponsePath,
13341309
result: mixed,
1335-
): mixed {
1310+
): ExecutionPartialResult<mixed> {
13361311
// Collect sub-fields to execute to complete this value.
13371312
let subFieldNodes = Object.create(null);
13381313
const visitedFragmentNames = Object.create(null);

0 commit comments

Comments
 (0)