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_callbackque se ejecuten casi de inmediato, como si hubiera pasado en 0lugar de un gran número como retraso.
¿Por qué pasó esto?
javascript
settimeout
Matt Ball
fuente
fuente

delay >>> 0sucede 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(49999861776384hace que la devolución de llamada se49999861776383 % 2147483648 === 2147483647Puedes 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
stopTimermé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_VALUEes un número entero. Es el número entero 17976931348623157 con 292 ceros después. La razón por la queparseIntregresa1es 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) === fooen su lugar.Number.MAX_VALUEno 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_VALUEno 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_INTEGERpero ese no es el número que estamos buscando aquí.