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
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; }