doWhile метод
Повторяет операцию до тех пор, пока она не вернет false.
Операция action, может быть синхронной или асинхронной.
Операция вызывается повторно, пока она возвращает значение bool true или Future<bool>, которое завершается со значением true.
Если вызов action возвращает false или Future, который завершается значением false, итерация завершается, и будущее, возвращаемое методом doWhile, завершается со значением null.
Если вызов action генерирует исключение или будущее, возвращаемое action завершается ошибкой, итерация завершается, и будущее, возвращаемое методом doWhile, завершается с той же ошибкой.
Вызовы action могут происходить в любое время, включая сразу после вызова doWhile. Единственное ограничение состоит в том, что новый вызов action не произойдет до возвращения предыдущего вызова, и если он вернул Future<bool>, не до завершения этого будущего.
Пример:
void main() async {
var value = 0;
await Future.doWhile(() async {
value++;
await Future.delayed(const Duration(seconds: 1));
if (value == 3) {
print('Finished with $value');
return false;
}
return true;
});
}
// Outputs: 'Finished with 3'Реализация
static Future doWhile(FutureOr<bool> action()) {
_Future<void> doneSignal = new _Future<void>();
late void Function(bool) nextIteration;
// Bind this callback explicitly so that each iteration isn't bound in the
// context of all the previous iterations' callbacks.
// This avoids, e.g., deeply nested stack traces from the stack trace
// package.
nextIteration = Zone.current.bindUnaryCallbackGuarded((bool keepGoing) {
while (keepGoing) {
FutureOr<bool> result;
try {
result = action();
} catch (error, stackTrace) {
// Cannot use _completeWithErrorCallback because it completes
// the future synchronously.
_asyncCompleteWithErrorCallback(doneSignal, error, stackTrace);
return;
}
if (result is Future<bool>) {
result.then(nextIteration, onError: doneSignal._completeError);
return;
}
// TODO(40014): Remove cast when type promotion works.
keepGoing = result as bool;
}
doneSignal._complete(null);
});
nextIteration(true);
return doneSignal;
}
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.18.5/dart-async/Future/doWhile.html