2012-09-28 15 views
18

Estoy teniendo problemas en Firefox 15 y Chrome 21 con el siguiente código:¿Cuál es la demora máxima para setInterval?

setInterval(function() { console.log('test') }, 300000000000) 

Tanto en los navegadores, la función se ejecuta de inmediato repite muy rápidamente. Claro, esa es una gran cantidad (que representa aproximadamente 10 años a partir de ahora), pero no esperaría que se tratara como un número pequeño o negativo. No he visto un retraso máximo permitido en ninguna documentación. ¿Alguien sabe si hay un máximo estándar, o si esto son solo los navegadores graciosos?

+2

sospecho que el número puede ser obligado a un número entero de 32 bits en algún lugar a lo largo del camino ... – Pointy

+0

@Pointy, eso es probablemente una buena conjetura. Hmm ...: -/ – Nogwater

+0

@Pointy. Parece que 2^31-1 es seguro, pero 2^31 se rompen, por lo que definitivamente tienes razón. Si publica esto como respuesta, le daré el karma. – Nogwater

Respuesta

10

No puedo encontrar ninguna documentación por el momento, pero no me sorprendería si el valor del temporizador tuviera que encajar en un entero con signo de 32 bits.

+0

Esto es correcto. setInterval() falla con valores mayores que 32-bit firm int. –

4

Creo que la demora máxima es 2 -1 que es 2.147.483.647ms. El valor máximo de un entero de 32 bits con signo en ms. Si no estuviera firmado, sería 2 -1 = 4,294,967,295.

+0

2 Billones 147 Millones. – gr3g

+1

Buen punto, el tipo está firmado. – rekire

20

El intervalo se almacena en un int firmado de 32 bits (en la implementación probada: V8 en Google Chrome), por lo que el comportamiento que está viendo es el resultado del desbordamiento del intervalo a un número negativo (en cuyo caso se comporta como si el intervalo fuera 0). Por lo tanto, el intervalo máximo que puede usar es 2**31 - 1.

Así es como decidí que este era el caso:

setInterval(function(){console.log("hi");}, Math.pow(2,31)); 

se comporta como el intervalo es 0.

setInterval(function(){console.log("hi");}, Math.pow(2,31) - 1); 

No se dispara en el momento en que estaba dispuesto a esperar.

setInterval(function(){console.log("hi");}, Math.pow(2,33) + 1000); 

se comporta como el intervalo es 1000 (un segundo). Aquí, el 2**33 no afecta los primeros 32 bits, por lo que obtenemos solo 1000.

El intervalo más alto posible, 2**31-1ms es un poco tímido de 25 días, por lo que es más que suficiente para cualquier cosa razonable.

+0

El intervalo * en esa implementación particular * se almacena en .. pero +1 para mostrar la metodología utilizada. –

+0

Buenas pruebas de ejemplo.Básicamente hice lo mismo en mi comentario sobre la pregunta en sí, pero +1 para mostrar tu trabajo. :) – Nogwater

0

Max es 2,147,483,647 (2 -1)

tener cuidado de que si se hace el número más grande que eso, se ejecutará inmediatamente (Imaging que se pone un valor negativo, por lo que el navegador se ejecutará infinitamente loop)

setInterval(()=>console.log('n'),2147483647) 
31 
setInterval(()=>console.log('y'),2147483648) 
38 
(1588) y 
Cuestiones relacionadas