*Async 명명 규칙

모든 지연 연산자와 집계 연산자에는 FxAsyncIterable에서 동작하는 짝이 있습니다 — 동작은 같고, 콜백만 비동기 친화적입니다.

Iterable<B> map<A, B>(B Function(A a) f, Iterable<A> iterable) FxAsyncIterable<B> mapAsync<A, B>(FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable) Future<List<A>> toListAsync<A>(FxAsyncIterable<A> iterable) Future<A> reduceAsync<A>(FutureOr<A> Function(A acc, A a) f, FxAsyncIterable<A> iterable) Fx<R> Fx.map<R>(R Function(T a) f) // sync chain FxAsync<R> FxAsync.map<R>(FutureOr<R> Function(T a) f) // async chain — same name!

강의

Dart에는 타입 없는 커링이 없기 때문에, FxDart는 하나의 map을 오버로드해서 data-first 위치의 IterableFxAsyncIterable 양쪽에서 동작하게 만들 수 없습니다. 매개변수 타입이 충돌하기 때문입니다. 그래서 모든 지연 연산자와 집계 연산자는 최상위 함수로 두 가지 형태를 제공합니다. Iterable용의 평범한 이름, 그리고 콜백이 R 대신 FutureOr<R>를 반환하는 FxAsyncIterable*Async 짝입니다. 이미 몇 가지는 만나 보셨습니다. map/mapAsync, filter/filterAsync, toList/toListAsync, reduce/reduceAsync, fold/foldAsync, each/eachAsync, find/findAsync — 라이브러리의 사실상 모든 함수가 이 규칙을 따릅니다.

체인 형태에는 이런 구분이 필요 없습니다. .toAsync()를 호출하거나 fxAsync/fxStream에서 시작하고 나면, 그 FxAsync 체인의 이후 메서드는 모두 원래 이름을 그대로 씁니다 — .mapAsync(...)가 아니라 .map(...)입니다. 수신자의 타입만으로 어느 쪽을 쓸지 Dart가 이미 알 수 있기 때문입니다. 접미사는 모호함을 없애야 하는 최상위 data-first 호출에만 존재합니다.

데모 1 · 짝지어 놓고 비교하기

FxAsyncIterable을 다루는 순간, data-first 호출에는 항상 Async 접미사가 필요합니다.

데모 2 · data-first 형태 vs. 체인 형태

.toAsync()가 수신자의 타입을 바꾸고 나면, 체인 형태는 동기 버전과 똑같이 읽힙니다 — 접미사가 없습니다.

직접 해 보기

연습: data-first map*Async 짝을 사용해 이 비동기 파이프라인의 모든 이름을 대문자로 바꿔 보세요.

관련 항목: toAsync — 비동기 파이프라인의 출발점 · Stream 브리지 — fromStream, fxStream, toStream · concurrent — 병렬 평가 · map — 동기 원본