Метод timeout
Метод timeout класса Stream позволяет ограничить время ожидания событий от потока. Если очередное событие не поступает в течение заданного интервала, метод генерирует ошибку TimeoutException. Первым параметром метод принимает длительность Duration, в течение которой ожидается событие. Вторым необязательным параметром можно передать функцию onTimeout, которая будет вызвана вместо генерации ошибки. Третьим необязательным параметром передается функция onTimeout, возвращающая альтернативный поток.
Синтаксис
stream.timeout(timeLimit, [onTimeout])
Пример
Давайте создадим поток, который испускает события с задержкой, и применим к нему метод timeout с лимитом в 1 секунду:
import 'dart:async';
void main()
{
Stream<int> stream = Stream.periodic(
Duration(seconds: 2),
(int count) => count
);
stream.timeout(Duration(seconds: 1)).listen(
(int value) {
print('Value: $value');
},
onError: (Object error) {
print('Error: $error');
}
);
}
Результат выполнения кода:
"Error: TimeoutException after 0:00:01.000000: Future not completed"
Пример
Давайте вместо ошибки при таймауте вернем значение по умолчанию, используя параметр onTimeout:
import 'dart:async';
void main()
{
Stream<int> stream = Stream.periodic(
Duration(seconds: 2),
(int count) => count
);
stream.timeout(
Duration(seconds: 1),
onTimeout: (EventSink<int> sink) {
sink.add(-1);
sink.close();
}
).listen(
(int value) {
print('Value: $value');
},
onDone: () {
print('Stream closed');
}
);
}
Результат выполнения кода:
"Value: -1"
"Stream closed"
Пример
Давайте создадим поток, который успевает испустить все события до истечения таймаута:
import 'dart:async';
void main()
{
Stream<int> stream = Stream.fromIterable([1, 2, 3]);
stream.timeout(Duration(seconds: 1)).listen(
(int value) {
print('Value: $value');
},
onDone: () {
print('Stream closed');
}
);
}
Результат выполнения кода:
"Value: 1"
"Value: 2"
"Value: 3"
"Stream closed"
Смотрите также
-
класс
Stream,
который представляет поток событий -
метод
handleError,
который обрабатывает ошибки потока -
метод
listen,
который подписывается на события потока -
метод
transform,
который преобразует поток с помощью StreamTransformer