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
TimeoutExceptionfărăimport 'dart:async';. Clasa este îndart:async. - Crezi că
timeoutopreș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.