Skip to content

Commit 2f7e074

Browse files
committed
Fix issue where _ResultCollector would callback with incomplete results
When passed a deferred that has already resolved, the result collector would incorrectly callback even if there were still pending defers to resolve.
1 parent 2a3aedb commit 2f7e074

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

graphql/core/defer.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -460,17 +460,16 @@ class _ResultCollector(Deferred):
460460
_result = None
461461

462462
def _schedule_callbacks(self, items, result):
463-
self.objects_remaining_to_resolve = 0
463+
self.objects_remaining_to_resolve = len(items)
464464
self._result = result
465465
for key, value in items:
466466
if isinstance(value, Deferred):
467-
self.objects_remaining_to_resolve += 1
468-
469467
value.add_callbacks(self._cb_deferred, self._cb_deferred,
470468
callback_args=(key, True),
471469
errback_args=(key, False))
472470

473471
else:
472+
self.objects_remaining_to_resolve -= 1
474473
result[key] = value
475474

476475
if self.objects_remaining_to_resolve == 0 and not self.called:
@@ -480,18 +479,20 @@ def _schedule_callbacks(self, items, result):
480479
def _cb_deferred(self, result, key, succeeded):
481480
# If one item fails, we are going to errback right away with the error.
482481
# This follows the Promise.all(...) spec in ES6.
482+
if self.called:
483+
return result
483484

484485
if not succeeded:
485-
if not self.called:
486-
self.errback(result)
487-
488-
return
486+
self.errback(result)
487+
self._result = None
488+
return result
489489

490490
self.objects_remaining_to_resolve -= 1
491491
self._result[key] = result
492492

493-
if not self.called and self.objects_remaining_to_resolve == 0:
493+
if self.objects_remaining_to_resolve == 0:
494494
self.callback(self._result)
495+
self._result = None
495496

496497
return result
497498

0 commit comments

Comments
 (0)