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 · 대체 값이 있는 비동기 조회

직접 해 보기

연습: 각 검색어를 그 검색 결과 곁에 붙잡아 두세요.

관련 항목: map — 입력을 보내도 될 때 · zip별개의 두 시퀀스 짝짓기 · concurrent — attach 뒤에서 비동기 팬아웃 제한하기