Dart DocumentationutilsFutureGroup<T>

FutureGroup<T> class

A completer that waits until all added Futures complete.

class FutureGroup<T> {
 int _pending = 0;
 Completer<List<T>> _completer = new Completer<List<T>>();
 final List<Future<T>> futures = <Future<T>>[];
 bool completed = false;

 final List<T> _values = <T>[];

 /// Wait for [task] to complete.
 Future<T> add(Future<T> task) {
   if (completed) {
     throw new StateError("The FutureGroup has already completed.");
   }

   _pending++;
   futures.add(task.then((value) {
     if (completed) return;

     _pending--;
     _values.add(value);

     if (_pending <= 0) {
       completed = true;
       _completer.complete(_values);
     }
   }).catchError((e) {
     if (completed) return;

     completed = true;
     _completer.completeError(e);
   }));

   return task;
 }

 Future<List> get future => _completer.future;
}

Properties

bool completed #

bool completed = false

final Future<List> future #

Future<List> get future => _completer.future;

final List<Future<T>> futures #

final List<Future<T>> futures = <Future<T>>[]

Methods

Future<T> add(Future<T> task) #

Wait for task to complete.

Future<T> add(Future<T> task) {
 if (completed) {
   throw new StateError("The FutureGroup has already completed.");
 }

 _pending++;
 futures.add(task.then((value) {
   if (completed) return;

   _pending--;
   _values.add(value);

   if (_pending <= 0) {
     completed = true;
     _completer.complete(_values);
   }
 }).catchError((e) {
   if (completed) return;

   completed = true;
   _completer.completeError(e);
 }));

 return task;
}