retryOn, repeat & whenComplete
에러나 완료에서 다시 구독합니다 — 예산으로, 지연으로, 또는 다시 시도할 때를 정하는 알림 스트림으로.
강의
풀 레이어의 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 — 얼마나 자주가 아니라 한 번의 풀이 얼마나 걸릴 수 있는지를 제한