mapEither & mapEitherAsync

이벤트마다 자신의 raise 스코프에서 돌립니다. r.raise (그리고 r.ensure / r.bind)는 Left가 되고, 평범한 반환은 Right가 됩니다.

FxEvents<Either<E, R>> FxEvents<T>.mapEither<E, R>(R Function(Raise<E> r, T value) f) FxEvents<Either<E, R>> FxEvents<T>.mapEitherAsync<E, R>(FutureOr<R> Function(Raise<E> r, T value) f)

강의

attempt는 경계 변환입니다 — 이미 에러 채널에 있는 것을 Left로 바꿉니다. mapEither는 그 다음에, 또는 깨끗한 소스에서 쓰는 연산자입니다. 각 이벤트가 either 빌더 안에서 돌아가므로 r.ensure / r.raise로 일직선 Dart를 쓰고, 맵 전체의 결과는 Either<E, R>입니다. 실패한 이벤트가 소스를 취소하지 않으며, 이후 이벤트도 도착합니다.

던져진 예외는 에러 채널에 남습니다 — 그것이 either 빌더의 계약이고, attempt가 throw를 값으로 바꾸는 단 한 곳입니다. 콜백이 raise도 하고 throw도 하면 mapEither 안에서 eitherCatching을 써서 Either 하나가 나오게 하세요.

mapEitherAsync는 비동기 쌍둥이입니다. asyncMap처럼 한 번에 이벤트 하나. eitherAsync의 규칙이 그대로 옵니다. raise는 await된 체인 안에서 일어나야 합니다. await되지 않은 future에서의 raise는 스코프보다 오래 살아남아 Left가 아니라 처리되지 않은 존 에러가 됩니다.

소스 에러는 두 연산자 모두 손대지 않고 통과합니다. 그것도 Left로 만들고 싶으면 위쪽에 attempt를 두세요.

데모 1 · raise는 Left, 반환은 Right

데모 2 · mapEitherAsync, 한 번에 하나

직접 해 보기

연습: 던져진 예외는 에러 채널에 남고, 체인은 그 뒤를 계속 갑니다.

관련 항목: attempt — throw를 Left로 바꾸는 경계 · either 빌더 — 같은 raise 스코프, 값 하나에서 · rights / separated — 나온 Either를 가르기