Stream.timeout în Dart

Emite o eroare TimeoutException (sau cheamă onTimeout) dacă între două valori trece mai mult decât timpul dat.

Sintaxă
Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)?})

Ce face Stream.timeout

timeout pornește un cronometru la ascultare și după fiecare valoare. Dacă următoarea valoare nu vine în timpul dat, stream-ul nou emite o TimeoutException. Stream-ul original nu se oprește din cauza asta.

Cu onTimeout decizi tu ce se întâmplă: primești un EventSink în care poți adăuga o valoare de rezervă, o eroare, sau poți închide stream-ul cu close().

Parametri

Parametru Descriere
timeLimit Pauza maximă permisă între două valori.
onTimeout Opțional: ce faci la expirare, prin sink.

Ce returnează

Un Stream<T> nou.

Exemple

Exemplul 1: Senzor care tace prea mult

import 'dart:async';

Stream<int> senzor() async* {
  yield 20;
  await Future.delayed(const Duration(milliseconds: 10));
  yield 21;
  await Future.delayed(const Duration(milliseconds: 300));
  yield 22;
}

Future<void> main() async {
  try {
    await for (final t in senzor().timeout(const Duration(milliseconds: 100))) {
      print('$t °C');
    }
  } on TimeoutException {
    print('Senzorul nu mai răspunde');
  }
}

Rezultat

20 °C
21 °C
Senzorul nu mai răspunde

Exemplul 2: Închidere elegantă cu onTimeout

Stream<String> mesaje() async* {
  yield 'Bună!';
  await Future.delayed(const Duration(milliseconds: 300));
  yield 'Mai ești acolo?';
}

Future<void> main() async {
  final s = mesaje().timeout(const Duration(milliseconds: 50), onTimeout: (sink) {
    sink.add('[conversație închisă din lipsă de activitate]');
    sink.close();
  });
  await s.forEach(print);
}

Rezultat

Bună!
[conversație închisă din lipsă de activitate]

Greșeli frecvente

  • Crezi că timeout limitează durata totală a stream-ului. Limitează pauza dintre două valori consecutive.

Comenzi înrudite

  • Future.timeout: Limitează cât aștepți un future: după timpul dat, aruncă TimeoutException sau folosește onTimeout.
  • TimeoutException: Excepția aruncată când un Future sau un Stream nu a terminat în timpul dat cu timeout.
  • Stream.handleError: Creează un stream nou care prinde erorile (toate sau doar unele) și lasă să treacă mai departe doar valorile.