Tengo los siguientes códigos Javascript
// COUNTDOWN TIMER function refillTimer(refillTimer){ var countDownDate = new Date(refillTimer).getTime(); var x = setInterval(function() { var now = new Date().getTime(); var distance = countDownDate - now; var hours = ("0" + Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))).slice(-2); var minutes = ("0" + Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60))).slice(-2); var seconds = ("0" + Math.floor((distance % (1000 * 60)) / 1000)).slice(-2); document.getElementById("refillTimer").innerHTML = hours + ":" + minutes + ":" + seconds; if(distance < 0){ clearInterval(x); document.getElementById("refillTimer").innerHTML = "00:00:00"; } }, 1000); } // ON SWIPE PERFORM ACTION async function swipeAction(currentElementObj, swipeType) { var cardId = currentElementObj.getAttribute("value"); var dataString = { card: cardId, swipe: swipeType }; let response = await new Promise((resolve, reject) => { try { var xhr = new XMLHttpRequest(); xhr.open("POST", "processes/swipe.php", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.responseType = "json"; xhr.send(JSON.stringify(dataString)); xhr.onreadystatechange = function () { let resObj = xhr.response; if(xhr.readyState == 4 && xhr.status == 200 && resObj) { if(resObj.action == 'gameover'){ refillTimer(resObj.nextgameoverTimer); }else if(resObj.action == 'killsalloted'){ refillTimer(resObj.nextkillsallotedTimer); } } }; }catch(e){ reject(e.toString()); } }); } Como puede ver en la función swipeAction() , tengo dos condiciones if y else if sobre el éxito donde llamo a los temporizadores. El problema aquí es que una vez que se llama al temporizador bajo una condición, al ser llamado en la otra condición, los temporizadores se superponen entre sí. Esto no debería suceder. Los temporizadores deben cargarse individualmente. Lo que técnicamente significa que la función del temporizador debe actualizarse cada vez que se llama o algo similar. Mire el GIF a continuación para ver el problema exacto.
Aquí, una condición llama a un temporizador de 12 horas mientras que la otra llama a un temporizador de 24 horas. Ambos temporizadores se superponen entre sí como se muestra arriba en lugar de mostrar solo el respectivo. ¿Cuál puede ser la solución requerida?
Ponga return x en refillTimer . Coloque let timer en la parte superior de swipeAction , cambie ambos refillTimer(...) en timer = refillTimer(...) . Ponga clearInterval(timer) encima de if(resObj.action...) .
Alternativamente, cambie var x = setInterval(...) a timer = setInterval(...) (no var ; también, evite x como nombre de variable, especialmente si tiene un alcance mayor). Ponga let timer delante de function refillTimer(...) { ... } . Ponga clearInterval(timer) al comienzo de la función refillTimer .
Cualquiera de estos cursos de acción garantizará que borre el temporizador de intervalos anterior antes de instalar uno nuevo y, por lo tanto, solo tendrá uno funcionando a la vez.