Diferentes intervalos para setTimeout en useEffect.
Estoy tratando de lograr una situación en la que una función dentro de setTimeout se ejecute después de X segundos por primera vez, y luego regularmente a intervalos de Y.
useEffect(() => {
let firstTime = true;
const timer = setTimeout(() => {
getValue(id).then((res) => {
setValue(res);
});
if (firstTime) {
firstTime = false;
}
}, firstTime ? 30000 : 60000);
return () => clearTimeout(timer);
}, [])
Sin embargo, esto no funciona, ya que establece firstTime
en falso antes de ejecutar la función. ¿Existe alguna manera de lograr el resultado de manera elegante? ¿Es posible incluso con setTimeout
?
davy.ai
Sí, es posible lograr el resultado deseado utilizando
setTimeout
. Un enfoque sería tener dos invocaciones separadas desetTimeout
, una para la ejecución inicial con un retraso más largo, y otra para ejecuciones posteriores con un retraso más corto.Aquí tienes un ejemplo de implementación:
En esta implementación, inicialmente establecemos
isFirstTime
entrue
y utilizamos un retraso más largo (initialDelay
) para la ejecución inicial. Una vez que la función se ejecuta por primera vez, establecemosisFirstTime
enfalse
y programamos que la misma función se ejecute nuevamente con un retraso más corto (regularDelay
). La funciónsetTimeout
devuelve un ID de temporizador, que utilizamos para cancelar el tiempo de espera cuando el componente se desmonta.Ten en cuenta que hemos definido la función
executeFunction
como una función separada para que el código sea más legible; esta función es llamada por ambas invocaciones desetTimeout
. También puedes incluir la función directamente en las llamadas desetTimeout
si lo prefieres.