@@ -460,17 +460,16 @@ class _ResultCollector(Deferred):
460
460
_result = None
461
461
462
462
def _schedule_callbacks (self , items , result ):
463
- self .objects_remaining_to_resolve = 0
463
+ self .objects_remaining_to_resolve = len ( items )
464
464
self ._result = result
465
465
for key , value in items :
466
466
if isinstance (value , Deferred ):
467
- self .objects_remaining_to_resolve += 1
468
-
469
467
value .add_callbacks (self ._cb_deferred , self ._cb_deferred ,
470
468
callback_args = (key , True ),
471
469
errback_args = (key , False ))
472
470
473
471
else :
472
+ self .objects_remaining_to_resolve -= 1
474
473
result [key ] = value
475
474
476
475
if self .objects_remaining_to_resolve == 0 and not self .called :
@@ -480,18 +479,20 @@ def _schedule_callbacks(self, items, result):
480
479
def _cb_deferred (self , result , key , succeeded ):
481
480
# If one item fails, we are going to errback right away with the error.
482
481
# This follows the Promise.all(...) spec in ES6.
482
+ if self .called :
483
+ return result
483
484
484
485
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
489
489
490
490
self .objects_remaining_to_resolve -= 1
491
491
self ._result [key ] = result
492
492
493
- if not self . called and self .objects_remaining_to_resolve == 0 :
493
+ if self .objects_remaining_to_resolve == 0 :
494
494
self .callback (self ._result )
495
+ self ._result = None
495
496
496
497
return result
497
498
0 commit comments