mdn loop ejemplo cleartimeout javascript settimeout

javascript - loop - ¿Qué sucede con setTimeout cuando la computadora se apaga?



sleep javascript ejemplo (7)

Aquí está mi código:

<!doctype html> <html> <body> <input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout(''alert(/'Surprise!/')'', 120000)"/> </body> <script> </script> </html>

He tomado tres escenarios que podrían responder a la pregunta.

Escenario 1: a los 00 segundos, haga clic en el botón ''Iniciar temporizador''. A los 25 segundos la computadora se queda dormida. A 1min 40 segundos se reactiva el ordenador. A los 2mins se muestra la alerta.

Escenario 2: a los 00 segundos, haga clic en el botón ''Iniciar temporizador''. A los 26 segundos la computadora se queda dormida. A los 3 minutos, despierto la computadora. Se muestra la alerta.

Escenario 3: Este es realmente asombroso.

<input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout(''alert(/'Surprise!/')'', 600000)"/>

A los 00 segundos, hago clic en el botón ''Iniciar temporizador''. Alrededor de 1 minuto y 30 segundos, la computadora está en modo de hibernación (mi PC tarda un minuto en iniciar la hibernación)

A los 8 minutos enciendo el portátil. Exactamente a los 10 minutos, aparece la alerta.

PS: This is my first ever comment on Stack Exchange. I prefer to execute code and view results rather than infer from theory.

En un navegador web moderno, supongamos que hago un setTimeout durante 10 minutos (a las 12:00) y 5 minutos más tarde pongo la computadora en suspensión, ¿qué debería pasar cuando el sistema se reactiva nuevamente? ¿Qué sucede si se despierta antes de que transcurran los 10 minutos (a las 12:09) o mucho más tarde (a las 16:00)?

La razón por la que pregunto es porque me gustaría solicitar un nuevo token de autenticación cada 10 minutos, y no estoy seguro de que el navegador haga lo correcto e inmediatamente solicite un nuevo token si se despierta después de un tiempo prolongado. hora.

Aclaraciones : no quiero usar cookies: estoy intentando crear un servicio web aquí; y sí, el servidor rechazará tokens antiguos e inválidos.


Basado en la respuesta de Ben, creé la siguiente utilidad. Puede ajustar la duración del muestreo, sin embargo, lo uso de esta manera para actualizar token:

const absoluteSetInterval = (handler, timeout) => { let baseTime = Date.now(); const callHandler = () => { if (Date.now() - baseTime > timeout) { baseTime = Date.now(); handler(); } }; return window.setInterval(callHandler, 1000); }; const absoluteClearInterval = (handle) => window.clearInterval(handle);


Compare la fecha y hora actual con la fecha y hora en que se cargó la página, así:

//Force refresh after x minutes. var initialTime = new Date(); var checkSessionTimeout = function () { var minutes = Math.abs((initialTime - new Date()) / 1000 / 60); if (minutes > 20) { setInterval(function () { location.href = ''Audit.aspx'' }, 5000) } }; setInterval(checkSessionTimeout, 1000);


Comportamiento de los temporizadores de JavaScript (setTimeout) en varios escenarios.

  1. Cuando el hilo está libre y el tiempo de espera se dispara: el temporizador se dispara inmediatamente después del tiempo de espera. Puede tener cierta imprecisión de aproximadamente 0-5 ms (escenario típico).
  2. Cuando el subproceso está súper ocupado (bucle enorme) el tiempo suficiente para pasar el tiempo de espera del temporizador: el temporizador se ejecutará inmediatamente después de que se libere el subproceso.
  3. Cuando hay una alerta: el mismo comportamiento que 2.
  4. Cuando el hilo está en pausa porque nuestro portátil se fue a dormir: he visto varias cosas. Pero lo más común es la inexactitud total e ignorar el tiempo empleado en dormir.

Dado que los temporizadores en JavaScript se basan en tics de CPU, y la CPU está inactiva, entonces el temporizador se detiene completamente y se reanuda como "ya que no habría pasado nada".


El comportamiento se basa tanto en el navegador como en el sistema operativo. El sistema operativo maneja la suspensión y las aplicaciones individuales a menudo no lo tienen en cuenta.

Lo más probable es que el sistema operativo vuelva a funcionar con el mismo tiempo restante en el temporizador que cuando se cerró. La otra posibilidad es que no se disparará en absoluto.

Si realmente es una preocupación, probablemente querrás estar mejor seguro que lamentarlo y guardar una marca de tiempo de cuando se inicializó el token y usar setInterval para verificarlo periódicamente (por ejemplo, dos veces por minuto).

Sin embargo, la seguridad no debe ser solo una cuestión del lado del cliente. Asegúrese de que su servidor emita un error si se utiliza un token antiguo / inválido y que el Ajax se comporta de manera adecuada en respuesta.

[editar] Estoy de acuerdo con la otra publicación en que podría activarse de inmediato en el siguiente tick. La entrada del blog de Resig es muy buena.


En el blog de John Resig, se dice que los temporizadores usan "reloj de pared". Creo que los eventos se activarán inmediatamente después de que se reanude la máquina porque setTimeout () no garantiza que la ejecución sea un punto específico en el tiempo, sino tan pronto como sea posible después del intervalo especificado. Sin embargo, no lo he comprobado yo mismo.


Hasta donde lo he probado, simplemente se detiene y se reanuda después de que la computadora se despierta. Supongo que eso significa que para una sesión, dependiendo del setTimeout/Interval el contador se setTimeout/Interval desde el momento en que la computadora se quedó dormida.

No creo que setTimeout/Interval confiar en la precisión de setTimeout/Interval para el tiempo crítico. Para Google Chrome, descubrí recientemente que cualquier tiempo de espera / intervalo (que sea inferior a 1 s) se reducirá a una vez por segundo si la pestaña donde se activa pierde el foco.

Aparte de eso, la precisión de los tiempos de espera / intervalos depende de otras funciones que se ejecutan, etc. En resumen: no es muy precisa.

Por lo tanto, usar el intervalo y los tiempos de espera, comparar la hora con una hora de inicio dentro de la función iniciada por ella le brindaría una mayor precisión. Ahora, si comienza a las 12:00, la computadora se pone en reposo y se despierta a las 16:13 o así. Si marca 16:13 contra 12:00, está seguro de que tiene que renovar el token. Un ejemplo del uso de la comparación de tiempo se puede encontrar here