use-poll
v1.0.1
Published
Reusable React polling hook with stop conditions
Readme
use-poll
Hook de React para ejecutar operaciones de polling de forma controlada hasta que se cumpla una condición de finalización.
Diseñado para entornos de producción donde se prioriza comportamiento predecible, simplicidad y control explícito del flujo.
Instalación
npm install use-pollDescripción
usePoll permite ejecutar una función asíncrona de forma repetida en intervalos definidos, deteniéndose automáticamente cuando una condición determinada se cumple.
El hook encapsula la gestión del intervalo, el ciclo de vida de las peticiones y la lógica de finalización, garantizando una ejecución segura frente a re-renderizados de React.
Uso
import { usePoll } from "use-poll";
function Example() {
const { data, isLoading, isCompleted } = usePoll({
interval: 3000,
fetcher: async () => {
const res = await fetch("/api/status");
if (!res.ok) throw new Error("Request failed");
return res.json();
},
stopCondition: (data) => data.completed === true
});
return (
<div>
<p>Loading: {String(isLoading)}</p>
<p>Completed: {String(isCompleted)}</p>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}API
usePoll(options)
Opciones
enabled?: booleanActiva o desactiva el polling. Por defectotrue.interval?: numberIntervalo en milisegundos entre ejecuciones. Por defecto2000.fetcher: () => Promise<T>Función asíncrona encargada de obtener los datos.stopCondition: (data: T) => booleanDetermina cuándo debe detenerse el polling.onSuccess?: (data: T) => voidSe ejecuta cuando se cumple la condición de finalización.onError?: (error: unknown) => voidSe ejecuta cuando ocurre un error en la petición.initialData?: TDatos iniciales opcionales. Evita el estado de carga inicial y evalúa inmediatamente la condición.
Retorno
data: T | nullÚltimos datos obtenidos correctamente.isLoading: booleanIndica si hay una petición en curso.error: Error | nullÚltimo error registrado.isCompleted: booleanIndica si el polling ha finalizado.
Comportamiento
- Garantiza una única petición activa en todo momento
- Detiene automáticamente el polling al cumplirse la condición
- Limpia el intervalo al desmontar el componente
- Evita problemas de closures obsoletos mediante referencias internas
- No requiere
useCallbackniuseMemopor parte del consumidor
Ejemplo con control dinámico
const { data } = usePoll({
enabled: isActive,
interval: 1000,
fetcher: fetchData,
stopCondition: (data) => data.status === "done"
});Casos de uso
- Seguimiento de procesos asíncronos
- Consulta periódica de estado en backend
- Espera de consistencia eventual
- Actualización controlada de datos con criterio de finalización
Licencia
MIT
