Make fields resolution asynchronous

This commit is contained in:
Deep Gaurav 2019-11-28 18:17:16 +05:30 committed by GitHub
parent a82aa0aaae
commit fad1b43aac
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

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