Esto no es práctico, pero estoy absolutamente desconcertado.
El único código que estoy usando es este siguiendo 2 líneas una y otra vez con diferentes números en la consola de un navegador:
var i = setInterval(() => console.log('test'), INTERVAL_VALUE); clearInterval(i); Estaba tratando de probar una entrada de número que controlaba un temporizador setInterval cuando accidentalmente descubrí que si solo escribía un gran número aleatorio en el cuadro (como lo haría cualquier buen evaluador de control de calidad), comenzaba a fallar. Pensé que era un problema con mi propio código, pero lo he reducido al caso reproducible lastimosamente mínimo anterior. Por alguna razón, ciertos rangos de números grandes para el intervalo hacen que se comporte como si se hubiera dado el valor 0 (es decir, imprime "prueba" en la consola cientos de veces por segundo).
Un rango de ejemplo es [11,000,000,000 - 12,000,000,000] . El rango no es exacto, ya que se extiende un poco más allá de los límites en ambas direcciones y no he encontrado los límites exactos, pero todos los valores dentro de ese rango causan problemas (incluido el valor con el que descubrí esto: 12,345,678,900 ). Si hace 10,000,000,000 o 13,000,000,000 , entonces (aparentemente) funciona como se esperaba (al menos, no fue rápido, es difícil probar un intervalo de 5 meses).
Probando números aleatorios, pude encontrar números mucho más grandes (más de 20 dígitos) que desencadenan y no desencadenan este problema, parece ser arbitrario, o al menos no relacionado con la escala.
¿Es este un problema conocido? ¿Alguien tiene idea de por qué puede estar pasando? Tengo que imaginar que es algún tipo de error de redondeo flotante o algo así. Obviamente, no es un problema para la mayoría de los desarrolladores que no pueda configurar un temporizador de más de 5 meses en el navegador, pero de todos modos es extraño y no está documentado AFAIK.
Nota: El argumento de retraso se convierte en un entero de 32 bits con signo. Esto limita efectivamente la demora a 2147483647 ms, ya que se especifica como un entero con signo en el IDL.
Está eligiendo un número más grande que el que puede caber en un número de 32 bits, por lo que cuando se convierte, a veces se convierte en un número negativo (si está en el rango correcto).