@@ -969,26 +969,9 @@ def execute_field(
969
969
result = resolve_fn (source , info , ** args )
970
970
971
971
if self .is_awaitable (result ):
972
- # noinspection PyShadowingNames
973
- async def await_result () -> Any :
974
- try :
975
- completed = self .complete_value (
976
- return_type ,
977
- field_nodes ,
978
- info ,
979
- path ,
980
- await result ,
981
- async_payload_record ,
982
- )
983
- if self .is_awaitable (completed ):
984
- return await completed
985
- except Exception as raw_error :
986
- error = located_error (raw_error , field_nodes , path .as_list ())
987
- handle_field_error (error , return_type , errors )
988
- return None
989
- return completed
990
-
991
- return await_result ()
972
+ return self .complete_awaitable_value (
973
+ return_type , field_nodes , info , path , result , async_payload_record
974
+ )
992
975
993
976
completed = self .complete_value (
994
977
return_type , field_nodes , info , path , result , async_payload_record
@@ -1131,6 +1114,37 @@ def complete_value(
1131
1114
) # pragma: no cover
1132
1115
raise TypeError (msg ) # pragma: no cover
1133
1116
1117
+ async def complete_awaitable_value (
1118
+ self ,
1119
+ return_type : GraphQLOutputType ,
1120
+ field_nodes : List [FieldNode ],
1121
+ info : GraphQLResolveInfo ,
1122
+ path : Path ,
1123
+ result : Any ,
1124
+ async_payload_record : Optional [AsyncPayloadRecord ] = None ,
1125
+ ) -> Any :
1126
+ """Complete an awaitable value."""
1127
+ try :
1128
+ resolved = await result
1129
+ completed = self .complete_value (
1130
+ return_type ,
1131
+ field_nodes ,
1132
+ info ,
1133
+ path ,
1134
+ resolved ,
1135
+ async_payload_record ,
1136
+ )
1137
+ if self .is_awaitable (completed ):
1138
+ completed = await completed
1139
+ except Exception as raw_error :
1140
+ errors = (
1141
+ async_payload_record .errors if async_payload_record else self .errors
1142
+ )
1143
+ error = located_error (raw_error , field_nodes , path .as_list ())
1144
+ handle_field_error (error , return_type , errors )
1145
+ completed = None
1146
+ return completed
1147
+
1134
1148
def get_stream_values (
1135
1149
self , field_nodes : List [FieldNode ], path : Path
1136
1150
) -> Optional [StreamArguments ]:
@@ -1361,25 +1375,11 @@ def complete_list_item_value(
1361
1375
is_awaitable = self .is_awaitable
1362
1376
1363
1377
if is_awaitable (item ):
1364
- # noinspection PyShadowingNames
1365
- async def await_completed () -> Any :
1366
- try :
1367
- completed = self .complete_value (
1368
- item_type ,
1369
- field_nodes ,
1370
- info ,
1371
- item_path ,
1372
- await item ,
1373
- async_payload_record ,
1374
- )
1375
- return await completed if is_awaitable (completed ) else completed
1376
- except Exception as raw_error :
1377
- error = located_error (raw_error , field_nodes , item_path .as_list ())
1378
- handle_field_error (error , item_type , errors )
1379
- self .filter_subsequent_payloads (item_path , async_payload_record )
1380
- return None
1381
-
1382
- complete_results .append (await_completed ())
1378
+ complete_results .append (
1379
+ self .complete_awaitable_value (
1380
+ item_type , field_nodes , info , item_path , item , async_payload_record
1381
+ )
1382
+ )
1383
1383
return True
1384
1384
1385
1385
try :
@@ -1745,29 +1745,16 @@ def execute_stream_field(
1745
1745
# noinspection PyShadowingNames
1746
1746
async def await_completed_items () -> Optional [List [Any ]]:
1747
1747
try :
1748
- try :
1749
- completed = self .complete_value (
1748
+ return [
1749
+ await self .complete_awaitable_value (
1750
1750
item_type ,
1751
1751
field_nodes ,
1752
1752
info ,
1753
1753
item_path ,
1754
- await item ,
1754
+ item ,
1755
1755
async_payload_record ,
1756
1756
)
1757
- return [
1758
- await completed
1759
- if self .is_awaitable (completed )
1760
- else completed
1761
- ]
1762
- except Exception as raw_error :
1763
- error = located_error (
1764
- raw_error , field_nodes , item_path .as_list ()
1765
- )
1766
- handle_field_error (
1767
- error , item_type , async_payload_record .errors
1768
- )
1769
- self .filter_subsequent_payloads (item_path , async_payload_record )
1770
- return [None ]
1757
+ ]
1771
1758
except GraphQLError as error :
1772
1759
async_payload_record .errors .append (error )
1773
1760
self .filter_subsequent_payloads (path , async_payload_record )
0 commit comments