Stream.fromFuture în Dart

fromFuture face un stream cu rezultatul unui future; fromFutures emite rezultatele mai multor future-uri în ordinea terminării.

Sintaxă
factory Stream<T>.fromFuture(Future<T> future)
factory Stream<T>.fromFutures(Iterable<Future<T>> futures)

Ce face Stream.fromFuture

Stream.fromFuture(f) emite valoarea (sau eroarea) lui f și apoi se închide; face același lucru ca f.asStream().

Stream.fromFutures(lista) emite rezultatul fiecărui future imediat ce acesta se termină, deci în ordinea terminării, nu în ordinea din listă. Se închide după ultimul. Este bun pentru a arăta rezultatele pe măsură ce vin.

Parametri

Parametru Descriere
future Future-ul a cărui valoare este emisă.
futures Future-urile ale căror rezultate sunt emise.

Ce returnează

Un Stream<T>.

Exemple

Exemplul 1: Rezultate pe măsură ce sosesc

Clujul răspunde primul (20 ms), apoi Iașiul (50 ms), apoi Timișoara (80 ms).

Future<String> prognoza(String oras, int ms) =>
    Future.delayed(Duration(milliseconds: ms), () => '$oras: gata în $ms ms');

Future<void> main() async {
  final s = Stream.fromFutures([
    prognoza('Iași', 50),
    prognoza('Timișoara', 80),
    prognoza('Cluj', 20),
  ]);
  await for (final r in s) {
    print(r);
  }
}

Rezultat

Cluj: gata în 20 ms
Iași: gata în 50 ms
Timișoara: gata în 80 ms

Exemplul 2: Un singur future ca stream

Future<void> main() async {
  final raspuns = Future.delayed(const Duration(milliseconds: 10), () => 'Comanda #1024 confirmată');
  await Stream.fromFuture(raspuns).forEach(print);
}

Rezultat

Comanda #1024 confirmată

Greșeli frecvente

  • Crezi că fromFutures păstrează ordinea din listă. Pentru rezultate în ordinea listei folosește Future.wait.

Comenzi înrudite

  • Future.asStream: Transformă un future într-un stream care emite o singură valoare (sau eroarea) și apoi se închide.
  • Future.wait: Future.wait așteaptă mai multe future-uri în paralel și dă lista rezultatelor; Future.any dă primul rezultat terminat.
  • Stream.fromIterable: Creează un stream care emite, pe rând, elementele unei liste sau ale altui Iterable, apoi se închide.