Ce face Future.sync
Future.sync(f) cheamă funcția pe loc, înainte ca linia următoare să ruleze. Dacă funcția aruncă o excepție, excepția nu iese în afară, ci devine eroarea future-ului. Este util când combini cod sincron cu cod asincron și vrei ca toate erorile să ajungă în același loc.
Future.microtask(f) rulează funcția imediat după codul sincron curent, înaintea evenimentelor obișnuite (timere, Future.delayed, constructorul Future(...)).
Parametri
| Parametru | Descriere |
|---|---|
computation |
Funcția care calculează valoarea. |
Ce returnează
Un Future<T> cu rezultatul sau eroarea funcției.
Exemple
Exemplul 1: Ordinea de rulare
Codul sincron rulează primul, apoi microtask-urile, apoi evenimentele obișnuite.
Future<void> main() async {
final a = Future(() => print('4. Future() - eveniment'));
final b = Future.microtask(() => print('3. Future.microtask'));
final c = Future.sync(() => print('1. Future.sync - imediat'));
print('2. sfârșitul codului sincron');
await Future.wait([a, b, c]);
}
Rezultat
1. Future.sync - imediat
2. sfârșitul codului sincron
3. Future.microtask
4. Future() - eveniment
Exemplul 2: Erorile sincrone devin erori de future
Future<int> parseazaAsync(String text) => Future.sync(() => int.parse(text));
Future<void> main() async {
for (final t in ['42', 'patruzeci']) {
await parseazaAsync(t)
.then((n) => print('$t -> $n'))
.catchError((Object e) => print('$t -> eroare: ${(e as FormatException).message}'));
}
}
Rezultat
42 -> 42
patruzeci -> eroare: Invalid radix-10 number
Greșeli frecvente
- Crezi că
Future.syncface funcția să ruleze în fundal. Rulează imediat, pe același fir; doar rezultatul este pus într-un future.
Comenzi înrudite
scheduleMicrotask: Programează o funcție să ruleze imediat după codul sincron curent, înaintea timerelor și a altor evenimente.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.value: Future.value creează un future deja terminat cu o valoare, iar Future.error unul terminat cu o eroare.