Me encontré con un comportamiento inesperado al pasar un gran valor de milisegundos a setTimeout()
. Por ejemplo,
setTimeout(some_callback, Number.MAX_VALUE);
y
setTimeout(some_callback, Infinity);
ambos causan some_callback
que se ejecuten casi de inmediato, como si hubiera pasado en 0
lugar de un gran número como retraso.
¿Por qué pasó esto?
javascript
settimeout
Matt Ball
fuente
fuente
delay >>> 0
sucede algo como , por lo que el retraso pasado es cero. De cualquier manera, el hecho de que el retraso se almacene como un int sin firmar de 32 bits explica este comportamiento. ¡Gracias!49999861776383
(49999861776384
hace que la devolución de llamada se49999861776383 % 2147483648 === 2147483647
Puedes usar:
fuente
Alguna explicación aquí: http://closure-library.googlecode.com/svn/docs/closure_goog_timer_timer.js.source.html
fuente
setTimeout()
, pero espero que calculen la fecha y la hora en que debería despertarse y no disminuyan un contador en algún tick definido al azar ... (Uno puede esperar , al menos)Consulte el documento del nodo sobre Timers aquí: https://nodejs.org/api/timers.html (asumiendo lo mismo en js también, ya que ahora es un término tan ubicuo en el bucle de eventos basado
En breve:
Cuando la demora es mayor que 2147483647 o menor que 1, la demora se establecerá en 1.
y el retraso es:
La cantidad de milisegundos que se deben esperar antes de llamar a la devolución de llamada.
¿Parece que su valor de tiempo de espera está predeterminado en un valor inesperado según estas reglas, posiblemente?
fuente
Me encontré con esto cuando intenté cerrar la sesión automáticamente de un usuario con una sesión caducada. Mi solución fue restablecer el tiempo de espera después de un día y mantener la funcionalidad para usar clearTimeout.
Aquí hay un pequeño ejemplo de prototipo:
Uso:
Y puedes borrarlo con el
stopTimer
método:fuente
No puedo comentar, pero responder a todas las personas. Se necesita un valor sin firmar (obviamente, no puede esperar milisegundos negativos). Entonces, dado que el valor máximo es "2147483647", cuando ingresa un valor más alto, comienza a ir desde 0.
Básicamente, retraso = {VALOR}% 2147483647.
Entonces, usar un retraso de 2147483648 lo haría 1 milisegundo, por lo tanto, proceso instantáneo.
fuente
en realidad no es un número entero. El valor máximo permitido para setTimeout es probablemente 2 ^ 31 o 2 ^ 32. Tratar
y obtienes 1 de vuelta en lugar de 1.7976931348623157e + 308.
fuente
Number.MAX_VALUE
es un número entero. Es el número entero 17976931348623157 con 292 ceros después. La razón por la queparseInt
regresa1
es porque primero convierte su argumento en una cadena y luego busca la cadena de izquierda a derecha. Tan pronto como encuentra el.
(que no es un número), se detiene.Number.isInteger(foo)
. Pero como aún no es compatible, puede usarMath.round(foo) === foo
en su lugar.Number.MAX_VALUE
no es un número entero sino undouble
. Entonces hay que ... Un doble puede representar un número entero, ya que se usa para guardar números enteros de 32 bits en JavaScript.Number.MAX_VALUE
no es un número entero. Pero si por "entero" te refieres al concepto mental de "un número entero", entonces es un número entero. En JavaScript, debido a que todos los números son de coma flotante de 64 bits, es común usar la definición de concepto mental de "entero".Number.MAX_SAFE_INTEGER
pero ese no es el número que estamos buscando aquí.