es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SetInterval “apilándolos” uno encima de otro

Estoy trabajando en este proyecto que utiliza setInterval y estoy teniendo un poco de dificultad en entender cómo funciona setInterval. El problema que tengo es que cada vez que llamo a setInterval, la función parece apilarse una encima de la otra, lo que resulta en que el objeto aparezca múltiples veces rápidamente. No estoy seguro de qué estoy haciendo mal en este caso. ¿Alguien podría ayudarme? Gracias.

const [hit, setHit] = useState(0)
const [count, setCount] = useState(0)
var timer = null
var funcCalls = 0
const hitSound = new Audio("/hit.wav")
useEffect(() => {
    timer = setInterval(moveSquare, 2000)
}, [])
function handleHit(){
    hitSound.play()
    setHit(hit+1)
    resetSquare()
}
function resetSquare(){
    clearInterval(timer)
    moveSquare()
    timer = setInterval(moveSquare, 2000)
}
function moveSquare(){
    const gameContainer = document.getElementById("game-container")
    const height = gameContainer.offsetHeight
    const width = gameContainer.offsetWidth
    const square = document.getElementById("square")
    square.style.top = (Math.random() * (height - 100)) + "px";
    square.style.left = (Math.random() * (width - 100)) + "px";
}
return (
    <>
    <section classname='game-section'>
        <div classname='counter'>
            {hit}
            {count}
        </div>
        <div classname='game-container' id="game-container">
            <div classname="square" id="square" onclick="{handleHit}"></div>
        </div>
    </section>

)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema es que el antiguo setInterval no se está limpiando correctamente antes de que se inicie uno nuevo en la función resetSquare. Esto crea múltiples instancias de la misma función ejecutándose al mismo tiempo, lo que provoca que el objeto aparezca múltiples veces rápidamente.

    Para solucionar esto, puedes asegurarte de que el setInterval anterior se limpie antes de iniciar uno nuevo añadiendo clearInterval(timer) antes de timer = setInterval(moveSquare, 2000) en el useEffect hook y también en la función resetSquare.

    Esto debería evitar que se acumulen los setInterval y asegurarse de que solo se esté ejecutando una instancia de la función en cualquier momento dado.

Comments are closed.