Future.timeout în Dart

Limitează cât aștepți un future: după timpul dat, aruncă TimeoutException sau folosește onTimeout.

Sintaxă
Future<T> timeout(Duration timeLimit, {FutureOr<T> onTimeout()?})

Ce face Future.timeout

timeout(durata) returnează un future nou. Dacă originalul se termină la timp, primești rezultatul lui. Dacă nu, noul future se termină cu TimeoutException sau, dacă ai dat onTimeout, cu valoarea returnată de acesta.

Operația inițială nu este oprită: doar nu o mai aștepți. Pentru operații care trebuie anulate de-a binelea, ai nevoie de un mecanism de anulare propriu.

Parametri

Parametru Descriere
timeLimit Cât timp aștepți cel mult.
onTimeout Opțional: funcția care dă valoarea de rezervă când timpul expiră.

Ce returnează

Un Future<T> cu rezultatul la timp sau cu rezultatul lui onTimeout.

Exemple

Exemplul 1: Server lent

import 'dart:async';

Future<String> raspunsServer(int ms) =>
    Future.delayed(Duration(milliseconds: ms), () => 'răspuns după $ms ms');

Future<void> main() async {
  print(await raspunsServer(20).timeout(const Duration(milliseconds: 200)));
  try {
    await raspunsServer(300).timeout(const Duration(milliseconds: 50));
  } on TimeoutException catch (e) {
    print('Prea lent: ${e.message ?? 'timp depășit'} (${e.duration?.inMilliseconds} ms)');
  }
}

Rezultat

răspuns după 20 ms
Prea lent: Future not completed (50 ms)

Exemplul 2: Valoare de rezervă cu onTimeout

Future<double> cursEuro() => Future.delayed(const Duration(milliseconds: 300), () => 4.98);

Future<void> main() async {
  final curs = await cursEuro().timeout(
    const Duration(milliseconds: 50),
    onTimeout: () => 4.97,
  );
  print('Folosesc cursul $curs lei');
}

Rezultat

Folosesc cursul 4.97 lei

Greșeli frecvente

  • Prinzi TimeoutException fără import 'dart:async';. Clasa este în dart:async.
  • Crezi că timeout oprește operația lentă. Ea continuă în fundal; doar rezultatul ei nu mai este folosit.

Comenzi înrudite

  • TimeoutException: Excepția aruncată când un Future sau un Stream nu a terminat în timpul dat cu timeout.
  • Future.delayed: Creează un future care se termină după o durată dată, opțional cu valoarea unei funcții; pauza asincronă din Dart.
  • Stream.timeout: Emite o eroare TimeoutException (sau cheamă onTimeout) dacă între două valori trece mai mult decât timpul dat.
  • Future.wait: Future.wait așteaptă mai multe future-uri în paralel și dă lista rezultatelor; Future.any dă primul rezultat terminat.