From fad1b43aac305c6c9eeb15a72fe49eaa197e9645 Mon Sep 17 00:00:00 2001 From: Deep Gaurav Date: Thu, 28 Nov 2019 18:17:16 +0530 Subject: [PATCH] Make fields resolution asynchronous --- graphql_server/lib/graphql_server.dart | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/graphql_server/lib/graphql_server.dart b/graphql_server/lib/graphql_server.dart index 042694ca..0bcfbbaa 100644 --- a/graphql_server/lib/graphql_server.dart +++ b/graphql_server/lib/graphql_server.dart @@ -327,23 +327,23 @@ class GraphQL { var groupedFieldSet = collectFields(document, objectType, selectionSet, variableValues); var resultMap = {}; + var futureResultMap = >{}; 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 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; }