Merge pull request #37 from deep-gaurav/patch-1

Make fields resolution asynchronous
This commit is contained in:
Tobe Osakwe 2020-02-03 15:25:14 -05:00 committed by GitHub
commit 0a50ce1ad5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -327,23 +327,23 @@ class GraphQL {
var groupedFieldSet = var groupedFieldSet =
collectFields(document, objectType, selectionSet, variableValues); collectFields(document, objectType, selectionSet, variableValues);
var resultMap = <String, dynamic>{}; var resultMap = <String, dynamic>{};
var futureResultMap = <String, FutureOr<dynamic>>{};
for (var responseKey in groupedFieldSet.keys) { for (var responseKey in groupedFieldSet.keys) {
var fields = groupedFieldSet[responseKey]; var fields = groupedFieldSet[responseKey];
for (var field in fields) { for (var field in fields) {
var fieldName = var fieldName =
field.field.fieldName.alias?.name ?? field.field.fieldName.name; field.field.fieldName.alias?.name ?? field.field.fieldName.name;
var responseValue; FutureOr<dynamic> futureResponseValue;
if (fieldName == '__typename') { if (fieldName == '__typename') {
responseValue = objectType.name; futureResponseValue = objectType.name;
} else { } else {
var fieldType = objectType.fields var fieldType = objectType.fields
.firstWhere((f) => f.name == fieldName, orElse: () => null) .firstWhere((f) => f.name == fieldName, orElse: () => null)
?.type; ?.type;
if (fieldType == null) continue; if (fieldType == null) continue;
responseValue = await executeField( futureResponseValue = executeField(
document, document,
fieldName, fieldName,
objectType, objectType,
@ -355,10 +355,12 @@ class GraphQL {
globalVariables); globalVariables);
} }
resultMap[responseKey] = responseValue; futureResultMap[responseKey] = futureResponseValue;
} }
} }
for (var f in futureResultMap.keys) {
resultMap[f] = await futureResultMap[f];
}
return resultMap; return resultMap;
} }
@ -534,13 +536,18 @@ class GraphQL {
} }
var innerType = fieldType.ofType; var innerType = fieldType.ofType;
var out = []; var futureOut = [];
for (var resultItem in (result as Iterable)) { for (var resultItem in (result as Iterable)) {
out.add(await completeValue(document, '(item in "$fieldName")', futureOut.add(completeValue(document, '(item in "$fieldName")',
innerType, fields, resultItem, variableValues, globalVariables)); innerType, fields, resultItem, variableValues, globalVariables));
} }
var out = [];
for (var f in futureOut) {
out.add(await f);
}
return out; return out;
} }