Future.sync în Dart

Future.sync rulează funcția imediat și pune rezultatul într-un future; Future.microtask o rulează ca microtask.

Sintaxă
factory Future<T>.sync(FutureOr<T> computation())
factory Future<T>.microtask(FutureOr<T> computation())

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.sync face 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.