Ce face Future.then
then este forma veche, fără await, de a folosi un future: funcția onValue se cheamă cu valoarea, când aceasta este gata. Rezultatul lui then este un nou Future, deci poți înlănțui mai mulți pași.
Dacă onValue returnează un alt Future, lanțul îl așteaptă. Parametrul onError prinde erorile, dar de obicei se folosește catchError sau, mai simplu, await cu try/catch.
Parametri
| Parametru | Descriere |
|---|---|
onValue |
Funcția chemată cu valoarea future-ului. |
onError |
Opțional: funcția chemată dacă future-ul se termină cu eroare. |
Ce returnează
Un Future<R> cu rezultatul lui onValue.
Exemple
Exemplul 1: Lanț de pași
Future<int> citesteNota() => Future.delayed(const Duration(milliseconds: 10), () => 9);
Future<void> main() async {
await citesteNota()
.then((nota) => nota * 10)
.then((procent) => '$procent%')
.then((text) => print('Rezultat: $text'));
print('Lanțul s-a terminat.');
}
Rezultat
Rezultat: 90%
Lanțul s-a terminat.
Exemplul 2: then față de await
Cele două variante fac același lucru. Varianta cu await se citește de sus în jos, ca un cod obișnuit.
Future<String> oras() async => 'Cluj';
Future<int> temperatura(String oras) async => oras == 'Cluj' ? 24 : 20;
Future<void> main() async {
await oras().then(temperatura).then((t) => print('cu then: $t °C'));
final o = await oras();
final t = await temperatura(o);
print('cu await: $t °C');
}
Rezultat
cu then: 24 °C
cu await: 24 °C
Greșeli frecvente
- Nu aștepți future-ul returnat de
then, iar programul trece mai departe (sau se termină) înainte ca lanțul să ruleze. - Amesteci
thenșiawaitîn același cod fără motiv. Alege o variantă;awaiteste de obicei mai clar.
Comenzi înrudite
Future: O valoare care va fi gata mai târziu (citirea unui fișier, un răspuns de la server); o aștepți cu await.Future.catchError: Prinde eroarea unui future și o înlocuiește cu o valoare de rezervă (echivalentul lui catch pentru lanțuri then).Future.whenComplete: Rulează o funcție când future-ul se termină, fie cu succes, fie cu eroare (echivalentul lui finally).async și await: async marchează o funcție asincronă (întoarce Future), iar await așteaptă rezultatul unui Future fără să blocheze programul.