mapConcurrent

Mapear con límite de concurrencia en un solo paso — toAsync().map(f).concurrent(n), precombinado.

FxAsyncIterable<B> mapConcurrent<A, B>(int concurrency, FutureOr<B> Function(A a) f, Iterable<A> iterable) FxAsyncIterable<B> mapConcurrentAsync<A, B>(int concurrency, FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable) FxAsync<R> Fx<T>.mapConcurrent<R>(int concurrency, FutureOr<R> Function(T a) f) // chain (sync source) FxAsync<R> FxAsync<T>.mapConcurrent<R>(int concurrency, FutureOr<R> Function(T a) f) // chain (async source)

Lección

«Corre esta función async sobre estos valores, como mucho n a la vez, resultados en orden» es el pipeline async más común del código real — y hasta ahora decirlo costaba tres operadores: toAsync() para entrar al mundo async, map(f) para transformar y concurrent(n) para acotar la evaluación. mapConcurrent(n, f) es exactamente esa composición como un solo paso de la cadena.

Como es la composición — no una reimplementación —, todas las garantías se conservan: los resultados llegan en orden de origen (usa la forma larga con concurrentPool cuando quieras orden de finalización), como mucho concurrency callbacks están en vuelo, y los operadores aguas abajo siguen tirando perezosamente. Sobre una cadena ya async compone map(f).concurrent(n), saltándose el puente.

Es una adición nativa de Dart: FxTS canaliza concurrent como paso separado, y esa forma larga sigue disponible cuando necesites intercalar otro operador entre el map y el límite.

Demo 1 · Fan-out acotado, resultados en orden

Demo 2 · Es exactamente map + concurrent

Pruébalo tú

Ejercicio: trae todos los usuarios de dos en dos, conservando el orden.

Relacionados: concurrent — el limitador subyacente · concurrentPool — orden de finalización en vez de orden de origen · toAsync — el puente sync→async que este operador absorbe · concurrent or parallel — I/O vs CPU