Future.forEach în Dart

forEach rulează o acțiune asincronă pe rând pentru fiecare element; doWhile repetă o acțiune cât timp returnează true.

Sintaxă
static Future<void> forEach<T>(Iterable<T> elements, FutureOr action(T element))
static Future<void> doWhile(FutureOr<bool> action())

Ce face Future.forEach

Future.forEach(lista, actiune) cheamă acțiunea pentru primul element, așteaptă să termine, apoi trece la al doilea și așa mai departe. Este echivalentul unei bucle for cu await în interior.

Future.doWhile(actiune) cheamă acțiunea, așteaptă rezultatul și o cheamă din nou cât timp rezultatul este true. Se oprește la primul false. Ambele se opresc la prima eroare.

În codul modern, o buclă for sau while cu await face același lucru și se citește mai ușor.

Parametri

Parametru Descriere
elements Pentru forEach: elementele parcurse.
action Acțiunea, sincronă sau asincronă. La doWhile trebuie să returneze bool sau Future<bool>.

Ce returnează

Un Future<void> care se termină după ultimul pas.

Exemple

Exemplul 1: Trimiterea mesajelor una câte una

Future<void> trimite(String nume) async {
  await Future.delayed(const Duration(milliseconds: 10));
  print('SMS trimis către $nume');
}

Future<void> main() async {
  await Future.forEach(['Ana', 'Mihai', 'Ioana'], trimite);
  print('Toate mesajele au plecat.');

  for (final nume in ['Radu', 'Elena']) {
    await trimite(nume);
  }
}

Rezultat

SMS trimis către Ana
SMS trimis către Mihai
SMS trimis către Ioana
Toate mesajele au plecat.
SMS trimis către Radu
SMS trimis către Elena

Exemplul 2: doWhile: încercări până la reușită

Future<void> main() async {
  var incercare = 0;
  await Future.doWhile(() async {
    incercare++;
    await Future.delayed(const Duration(milliseconds: 10));
    final conectat = incercare == 3;
    print('Încercarea $incercare: ${conectat ? 'conectat' : 'eșuat'}');
    return !conectat;
  });
  print('Conectat după $incercare încercări.');
}

Rezultat

Încercarea 1: eșuat
Încercarea 2: eșuat
Încercarea 3: conectat
Conectat după 3 încercări.

Greșeli frecvente

  • Folosești lista.forEach((x) async { await ... }) și te aștepți să aștepte. Iterable.forEach nu așteaptă nimic; folosește Future.forEach sau for cu await.
  • La doWhile returnezi true când ai terminat. E invers: true înseamnă „mai rulează o dată”.

Comenzi înrudite

  • Future.wait: Future.wait așteaptă mai multe future-uri în paralel și dă lista rezultatelor; Future.any dă primul rezultat terminat.
  • Iterable.forEach: Apelează o funcție pentru fiecare element, în ordine.
  • Stream.forEach: Cheamă o funcție pentru fiecare valoare din stream și dă un Future care se termină la închiderea stream-ului.
  • for-in: Parcurge pe rând elementele unei liste, unui set sau oricărui Iterable, fără indice.