el temporizador no se detiene después de que ingresamos a otro componente y luego el componente perdedor se ejecutará, pero puedo verlo desmontado en la consola. Me refiero a querer limpiar la función del temporizador como componenteWillUnmount en componentes de clase.
function timeDown() { if (stepName == 'question') { let haveTime = state.haveTime; let time = setInterval(() => { haveTime -= 1; setState({ haveTime }) }, 1000); setTimeout(() => { clearInterval(time) dispatch(getNameStep(states.step)) }, 60000); } else { return } } useEffect(() => { timeDown() return () => { console.log('unmounted') timeDown() } }, [])el time no es un tiempo de espera sino un intervalo:
clearTimeout(time) ⇨ clearInterval(time)
Hay dos tipos de funciones de "temporizador". setInterval() y setTimeout() . Tenga en cuenta que cada uno de estos tiene sus respectivas funciones clear .
Cuando crea un temporizador usando setInterval() , debe borrarlo con clearInterval() , lo mismo para setTimeout() y clearTimeout() .
time , en su ejemplo, es un intervalo. El siguiente código debería funcionar:
function timeDown() { if (stepName == 'question') { let haveTime = state.haveTime; let time = setInterval(() => { haveTime -= 1; setState({ haveTime }) }, 1000); setTimeout(() => { clearInterval(time) dispatch(getNameStep(states.step)) }, 60000); } else { return } } useEffect(() => { timeDown() return () => { console.log('unmounted') timeDown() } }, [])https://medium.com/@monica1109/scheduling-settimeout-and-setinterval-ca2ee50cd99f#:~:text=The%20only%20difference%20is%20%2C,should%20call%20clearInterval(timerId)%20 . Este blog explica claramente la diferencia entre settimeout y setInterval