retryOn, repeat & whenComplete

에러나 완료에서 다시 구독합니다 — 예산으로, 지연으로, 또는 다시 시도할 때를 정하는 알림 스트림으로.

FxEvents<T> FxEvents<T>.retryOnError({int? count, Duration Function(int attempt)? delay}) // chain (events) FxEvents<T> FxEvents<T>.retryOn(Stream<void> Function(FxEvents<Object> errors) notifier) FxEvents<T> FxEvents<T>.repeat({int? count, Duration Function(int repeatCount)? delay}) FxEvents<T> FxEvents<T>.repeatOn(Stream<void> Function(FxEvents<void> completions) notifier) FxEvents<T> FxEvents<T>.whenComplete(void Function() callback)

강의

풀 레이어의 retry는 이터러블을 다시 만듭니다. 푸시 쪽에서 같은 생각은 재구독이고, 모양은 두 가지입니다. 하나는 팩토리로 스트림을 다시 만드는 것이고 — FxEvents.retry, 이미 다뤘습니다 — 한 번짜리 StreamController에 맞는 수입니다. 다른 하나는 같은 스트림을 다시 듣는 것이고, 이 페이지가 그것입니다: retryOnError, retryOn, repeat, repeatOn.

다시 들으려면 소스가 그것을 허용해야 합니다. Stream.multi, Stream.fromIterable, 브로드캐스트는 모두 되고, 이미 쓰인 단일 구독 컨트롤러는 두 번째 listen에서 에러가 납니다. 소스가 한 번짜리일 때는 FxEvents.retry (또는 FxEvents.defer)를 쓰세요.

retryOnError({count, delay})는 에러에서 다시 구독합니다 — count가 null이면 영원히, 아니면 그 횟수만큼의 재시도 (count: 2는 시도 세 번). delay가 있으면 각 재시도 전에 1부터 세는 재시도 번호로 물어봅니다. 예산을 다 쓰면 마지막 에러를 전달하고 스트림을 닫습니다.

retryOn(notifier)은 Rx의 retryWhen입니다: 에러는 전달되지 않고 notifier로 밀어 넣어지며, 그 스트림의 next가 다시 구독합니다. 알림 스트림이 완료되면 에러 없이 결과가 완료되고, 알림 스트림의 에러는 전달됩니다. repeat / repeatOn은 에러가 아니라 완료에서 같은 쌍입니다 — 에러는 전달되고 멈춥니다. whenComplete는 Rx finalize입니다: 콜백은 완료, 에러, 취소에서 정확히 한 번 실행됩니다. fxdart 이벤트 레이어, Rx의 retryWhen, retry, repeat, repeatWhen, finalize를 따랐습니다.

데모 1 · retryOnError, 지연과 함께

데모 2 · 짧은 스트림을 두 번 반복

직접 해 보기

연습: retryOn — 다시 구독할 때는 알림 스트림이 정합니다.

관련 항목: FxEvents.retry — 다시 들을 수 없는 소스를 위한 팩토리 형태 · retry — 백오프 훅과 원소 단위 범위를 가진 풀 레이어의 원본 · timeout — 얼마나 자주가 아니라 한 번의 풀이 얼마나 걸릴 수 있는지를 제한