Метод whenComplete
Метод whenComplete класса Future позволяет
выполнить указанную функцию после завершения Future.
При этом неважно, завершился Future успешно или с ошибкой -
функция будет вызвана в любом случае. В первый параметр
мы передаем функцию обратного вызова, которая будет
выполнена после завершения Future. Метод возвращает
новый Future, который завершается так же, как и исходный,
но только после выполнения переданной функции.
Синтаксис
Future<T> whenComplete(FutureOr<void> action())
Пример
Давайте создадим Future, который успешно завершается, и выполним код после его завершения:
void main()
{
Future.delayed(Duration(seconds: 1), () {
return 'success';
}).whenComplete(() {
print('Future completed');
}).then((value) {
print('Result: $value');
});
}
Результат выполнения кода:
"Future completed"
"Result: success"
Пример
Давайте создадим Future, который завершается с ошибкой,
и убедимся, что whenComplete все равно выполнится:
void main()
{
Future.delayed(Duration(seconds: 1), () {
throw Exception('Error occurred');
}).whenComplete(() {
print('Future completed');
}).catchError((error) {
print('Caught: $error');
});
}
Результат выполнения кода:
"Future completed"
"Caught: Exception: Error occurred"
Пример
Давайте используем whenComplete для закрытия ресурса
после завершения асинхронной операции:
void main()
{
bool isResourceOpen = true;
Future.delayed(Duration(seconds: 1), () {
return 'data loaded';
}).whenComplete(() {
isResourceOpen = false;
print('Resource closed');
}).then((value) {
print('Data: $value');
});
}
Результат выполнения кода:
"Resource closed"
"Data: data loaded"
Смотрите также
-
класс
Future,
который представляет результат асинхронной операции -
метод
then,
который выполняется при успешном завершении Future -
метод
catchError,
который обрабатывает ошибки Future -
метод
timeout,
который ограничивает время выполнения Future