Метод timeout
Метод timeout класса Future позволяет ограничить
время ожидания результата асинхронной операции. В первый
параметр мы передаём объект Duration, задающий
максимальное время ожидания. Во второй необязательный
параметр можно передать функцию onTimeout, которая
вызывается при истечении времени ожидания. Если функция
не передана, при превышении времени будет выброшено
исключение TimeoutException.
Синтаксис
future.timeout(duration, [onTimeout])
Пример
Давайте создадим Future, который завершится через
3 секунды, и установим таймаут в 1 секунду.
Так как операция не успеет завершиться, сработает
функция onTimeout:
void main()
{
Future<String> future = Future.delayed(
Duration(seconds: 3),
() => 'abcde'
);
future.timeout(
Duration(seconds: 1),
onTimeout: () => 'timeout'
).then((value) {
print(value);
});
}
Результат выполнения кода:
"timeout"
Пример
Давайте создадим Future, который завершится через
1 секунду, и установим таймаут в 3 секунды.
Операция успеет завершиться до истечения времени:
void main()
{
Future<String> future = Future.delayed(
Duration(seconds: 1),
() => 'abcde'
);
future.timeout(
Duration(seconds: 3),
onTimeout: () => 'timeout'
).then((value) {
print(value);
});
}
Результат выполнения кода:
"abcde"
Пример
Если не передавать функцию onTimeout, то при
истечении времени ожидания будет выброшено исключение
TimeoutException. Давайте обработаем его
с помощью catchError:
void main()
{
Future<String> future = Future.delayed(
Duration(seconds: 3),
() => 'abcde'
);
future.timeout(
Duration(seconds: 1)
).then((value) {
print(value);
}).catchError((error) {
print('Error: $error');
});
}
Результат выполнения кода:
"Error: TimeoutException after 0:00:01.000000: Future not completed"
Смотрите также
-
класс
Future,
который представляет результат асинхронной операции -
метод
delayed,
который создаёт Future с задержкой -
метод
then,
который обрабатывает успешный результат -
метод
catchError,
который обрабатывает ошибки