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.forEachnu așteaptă nimic; foloseșteFuture.forEachsauforcuawait. - La
doWhilereturnezitruecâ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.