retryOn, repeat & whenComplete
Resuscribirse ante error o ante finalización — con un presupuesto, un retardo o un notificador que decide cuándo volver a intentarlo.
Lección
El retry de la capa pull
reconstruye un iterable. En el lado push la misma idea es una
resuscripción, y hay dos formas. Una reconstruye
el stream desde una factoría —
FxEvents.retry, ya
cubierto — que es el movimiento correcto para un
StreamController de un solo uso. La otra vuelve a
escuchar el mismo stream, y esa es esta página:
retryOnError,
retryOn, repeat, repeatOn.
Volver a escuchar necesita una fuente que lo permita.
Stream.multi, Stream.fromIterable y un
broadcast lo hacen; un controlador de suscripción única agotado
fallará en el segundo listen. Acude a
FxEvents.retry (o
FxEvents.defer) cuando la fuente es de un solo uso.
retryOnError({count, delay}) resuscribe ante error —
para siempre cuando count es null, o hasta ese número
de reintentos (así que count: 2 son tres
intentos). delay, si se define, se consulta con el
número de reintento empezando en 1 antes de cada reintento. Cuando
el presupuesto se agota, se reenvía el último error y el stream se
cierra.
retryOn(notifier) es el retryWhen de Rx:
el error no se reenvía; se empuja al
notifier, y un next de ese stream resuscribe.
Completar el notificador completa el resultado sin el error; un
error del notificador se reenvía. repeat /
repeatOn son el mismo par ante
finalización en vez de error —
los errores se reenvían y paran. whenComplete es el
finalize de Rx: el callback corre exactamente una vez
ante done, error o cancel. Capa de eventos de fxdart, siguiendo a
retryWhen,
retry, repeat, repeatWhen y
finalize de Rx.
Demo 1 · retryOnError, con retardo
Demo 2 · Repetir un stream corto dos veces
Pruébalo tú
Ejercicio: retryOn — el notificador decide cuándo resuscribirse.
FxEvents.retry — la forma con factoría, para fuentes que no puedes volver a escuchar ·
retry — el original de la capa pull, con gancho de backoff y ámbito por elemento ·
timeout — acota cuánto puede tardar un pull, en vez de cuántas veces reintenta