attach
각 값을 거기서 유도한 것과 짝짓기 — 입력이 결과 곁에 남습니다.
Iterable<(A, B)> attach<A, B>(B Function(A a) f, Iterable<A> iterable)
FxAsyncIterable<(A, B)> attachAsync<A, B>(FutureOr<B> Function(A a) f, FxAsyncIterable<A> iterable)
Fx<(T, R)> Fx<T>.attach<R>(R Function(T a) f) // chain (sync)
FxAsync<(T, R)> FxAsync<T>.attach<R>(FutureOr<R> Function(T a) f) // chain (async)
강의
map은 각 값을 결과로 대체합니다 —
그리고 하류에서 입력이 다시 필요해지는 순간(대체 값으로
쓰려고, 라벨을 붙이려고, 로그를 남기려고) 손으로 레코드를 조립하는
자신을 발견하게 됩니다:
.map((x) async => (x, await f(x))).
attach(f)는 그 관용구를 연산자로 만든 것입니다.
(value, f(value)) 쌍을 지연 방식으로 내놓습니다.
진가는 비동기 체인에서 드러납니다. 품목마다 가격을 조회하면 쌍이
품목을 (없을 수도 있는) 가격 옆에 붙잡아 두므로, 대체 값
r.$2 ?? r.$1.listPrice도 "그게 어느 SKU였지?"
라벨도 여전히 손 닿는 곳에 있습니다. 비동기 형태는
mapAsync 위에 만들어져 병렬 안전합니다 — 뒤에
concurrent(n)을 붙이면
조회가 n개씩 동시에 실행됩니다.
Dart 고유의 추가 기능입니다(FxTS에는 대응물이 없습니다). 유도한 값만
필요하면 계속 map을 쓰고, 입력을 키로 삼은 조회 테이블이
필요하다면 그것은
indexBy입니다.
데모 1 · 입력이 map을 살아남습니다
데모 2 · 대체 값이 있는 비동기 조회
직접 해 보기
연습: 각 검색어를 그 검색 결과 곁에 붙잡아 두세요.