Este código está destinado a iniciar un temporizador cuando escribe algo en la entrada de texto, que contará cada segundo hasta llegar a 5 segundos y luego se detendrá. Pero sigue arrojando 0 , lo que crea un while loop interminable que bloquea el navegador. Estoy seguro de que me estoy perdiendo algo obvio aquí :-/ !?
var secondsPassed = 0; function setTimer() { while (secondsPassed <= 5) { console.log(secondsPassed); setInterval(function() { secondsPassed += 1; }, 1000); } } <input type="text" onkeyup="setTimer()">Es la forma incorrecta de establecer el intervalo y contar el tiempo.
Recomiendo algo del estilo de:
var secondsPassed = 0, timerOn = false; function setTimer(){ if(timerOn) return; var t0 = Date.now(); timerOn = true; var intervalId = setInterval( function(){ secondsPassed = Math.round((Date.now()-t0)/1000); console.log(secondsPassed) if(secondsPassed >= 10){ clearInterval(intervalId); timerOn = false; } }, 1000 ); } <input type="text" onkeyup="setTimer()">Detuve el temporizador después de 10 segundos, por si alguien quiere probarlo, pero claro, tendrás que detenerlo de lo contrario.
Su bucle while nunca se detendrá porque su condición ( secondsPassed <= 5 ) nunca se evaluará como verdadero, ya que setInterval no es síncrono.
En su lugar, debe mover la condición dentro de setInterval .
var secondsPassed = 0; function setTimer() { var interval = setInterval(function() { if (++secondsPassed == 5) clearInterval(interval); console.log(secondsPassed) }, 1000); } <input type="text" onkeyup="setTimer()">