Performs an async operation repeatedly until it returns false.
The function f is called repeatedly while it returns either the bool
value true or a Future which completes with the value true.
If a call to f returns false or a Future that completes to false,
iteration ends and the future returned by doWhile is completed.
If a future returned by f completes with an error, iteration ends and
the future returned by doWhile completes with the same error.
The f function must return either a bool value or a Future completing
with a bool value.
Source
static Future doWhile(f()) {
_Future doneSignal = new _Future();
var nextIteration;
// Bind this callback explicitly so that each iteration isn't bound in the
// context of all the previous iterations' callbacks.
nextIteration = Zone.current.bindUnaryCallback((bool keepGoing) {
if (keepGoing) {
new Future.sync(f).then(nextIteration,
onError: doneSignal._completeError);
} else {
doneSignal._complete(null);
}
}, runGuarded: true);
nextIteration(true);
return doneSignal;
}