peek, whenComplete & handleError

부수 효과, 에러마다 계속하기, finalize 훅 — .stream으로 체인을 벗어나지 않고.

FxEvents<T> FxEvents<T>.peek(void Function(T)? onData, {void Function(Object, StackTrace)? onError, void Function()? onDone}) FxEvents<T> FxEvents<T>.whenComplete(void Function() callback) // Rx finalize FxEvents<T> FxEvents<T>.handleError(Function onError, {bool Function(Object)? test}) FxEvents<T> FxEvents<T>.endWith(T value) FxEvents<T> FxEvents<T>.ifEmpty(T Function() fallback)

강의

풀 레이어의 peek는 값이 pull될 때 관찰합니다. 이벤트 레이어의 peek는 푸시 스트림에서 같은 개념에 같은 단어입니다: 부수 효과를 실행하고, 이벤트는 그대로 통과시킵니다. 선택적 onError / onDone 훅이 나머지 두 알림을 덮습니다. 콜백이 throw하면 에러 이벤트가 되고 체인은 계속됩니다 — peek가 실패한 그 이벤트는 다시 내보내지지 않습니다. fxdart 이벤트 레이어, Rx의 tap / doOn*을 따랐습니다.

handleError는 에러마다 계속하는 형태입니다: 맞는 에러(test를 생략하면 모든 에러)가 onError를 실행하고 스트림은 계속 갑니다. 소스를 취소하고 갈아타는 onErrorResume이 아닙니다. 잡음을 기록하거나 삼킬 때는 handleError를, 연결을 버릴 때는 onErrorResume를 쓰세요. whenComplete는 Rx의 finalize입니다: 콜백은 완료에서, 에러에서, 또는 취소에서 정확히 한 번 실행됩니다. throw해도 체인은 여전히 정리됩니다.

체인은 이제 endWith, ifEmpty, uniq, takeRight, takeWhile에서도 .stream으로 떨어지지 않습니다 — 이제 FxEvents 메서드입니다. uniq는 전역입니다(인접이 아님): 본 값의 집합이 한없이 자라므로, 오래 사는 피드에 묶이지 않은 uniq는 메모리 누수입니다. 연속 반복만 걸러야 할 때는 uniqAdjacent를 쓰세요.

fxdart 이벤트 레이어, Rx의 tap, 갈아타지 않는 모양의 catchError, 그리고 finalize를 따랐습니다. 이미 같은 뜻을 가진 곳에서는 풀 레이어 이름이 이깁니다: peek이지 tap이 아니고, takeRight이지 takeLast가 아니고, uniq이지 distinct가 아닙니다.

데모 1 · 부수 효과로서의 peek

데모 2 · endWith, 그리고 ifEmpty

직접 해 보기

연습: 완료에서, 그리고 취소에서 whenComplete.

관련 항목: peek — 값이 pull될 때 관찰하는 풀 레이어의 원본 · onErrorResume — 버리고 갈아타기; handleError는 계속하는 형태 · tap — 스트림이 아니라 값 하나의 데이터-퍼스트 부수 효과