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.

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)

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.

Relacionado: 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