100 votes

Que se passe-t-il avec setTimeout lorsque l'ordinateur passe en veille ?

Dans un navigateur web moderne, supposons que je fasse un setTimeout pour 10 minutes (à 12h00), et que 5 minutes plus tard je mette l'ordinateur en veille, que devrait-il se passer lorsque le système se réveille à nouveau? Que se passe-t-il s'il se réveille avant les 10 minutes (à 12h09) ou beaucoup plus tard (à 16h00)?

La raison pour laquelle je pose cette question est que j'aimerais demander un nouveau jeton d'authentification toutes les 10 minutes, et je ne suis pas sûr si le navigateur fera ce qu'il faut et demandera immédiatement un nouveau jeton s'il se réveille après un long moment.

Clarifications: Je ne veux pas utiliser de cookies - j'essaie de construire un service web ici; et oui, le serveur rejettera les jetons anciens et invalides.

80voto

KooiInc Points 38845

À ce que j'ai testé, il s'arrête simplement et reprend après que l'ordinateur se réveille. Lorsque l'ordinateur se réveille, le setInterval/setTimeout ne sait pas que le temps s'est écoulé.

Je ne pense pas que vous devriez compter sur l'exactitude de setTimeout/Interval pour des choses cruciales en terme de temps. Pour Google Chrome, j'ai récemment découvert que tout délai/interval (inférieur à 1s) sera ralenti à une fois par seconde si l'onglet où il est activé perd le focus.

En dehors de cela, l'exactitude des délais/intervals dépend d'autres fonctions en cours d'exécution, etc. En bref : ce n'est pas très précis.

Donc, utiliser l'intervalle et les délais, en vérifiant le temps par rapport à un temps de démarrage à l'intérieur de la fonction lancée par celui-ci vous donnerait une meilleure précision. Maintenant, si vous commencez à 12:00, l'ordinateur se met en veille et se réveille à 16:13 environ, en vérifiant 16:13 par rapport à 12:00, vous êtes sûr que vous devez renouveler le jeton. Un exemple d'utilisation de la comparaison de temps peut être trouvé ici

14voto

Ben Points 19

Comparer la date et l'heure actuelles par rapport à la date et l'heure à laquelle la page a été chargée, comme suit :

//Forcer le rafraîchissement après 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);

11voto

DannyBoi Points 488

Voici mon code :

J'ai pris trois scénarios qui pourraient répondre à la question.

Scénario 1: À 00 secondes, cliquez sur le bouton 'Démarrer le minuteur'. À 25 secondes, l'ordinateur se met en veille. À 1 minute 40 secondes, réveillez l'ordinateur. À 2 minutes, une alerte est affichée.

Scénario 2 : À 00 secondes, cliquez sur le bouton 'Démarrer le minuteur'. À 26 secondes, l'ordinateur se met en veille. À 3 minutes, je réveille l'ordinateur. L'alerte est affichée.

Scénario 3 : Celui-ci est vraiment étonnant.

À 00 secondes, je clique sur le bouton 'Démarrer le minuteur'. À environ 1 minute 30 secondes, l'ordinateur passe en mode hibernation (mon PC met une minute à passer en mode hibernation)

À 8 minutes, j'allume l'ordinateur portable. À 10 minutes exactement, l'alerte s'affiche.

PS : C'est mon tout premier commentaire sur Stack Exchange. Je préfère exécuter du code et voir les résultats plutôt que de les déduire de la théorie.

5voto

Andrew Curioso Points 1522

Le comportement est basé à la fois sur le navigateur et le système d'exploitation. Le système d'exploitation gère le mode veille et les applications individuelles ne tiennent souvent pas compte de cela.

Ce qui se produira le plus probablement, c'est que le système d'exploitation reviendra avec le même temps restant sur le minuteur que lors de l'arrêt. L'autre possibilité est qu'il ne se déclenchera pas du tout.

Si c'est vraiment une préoccupation, vous voudrez probablement être prudent et stocker une horodatage de l'initialisation du jeton et utiliser setInterval pour le vérifier périodiquement (disons deux fois par minute).

Cependant, la sécurité ne devrait pas se limiter uniquement au côté client. Assurez-vous que votre serveur renvoie une erreur si un jeton ancien / invalide est utilisé et que l'Ajax se comporte de manière appropriée en réponse.

[modifier] Je suis d'accord avec l'autre publication selon laquelle cela pourrait se déclencher immédiatement à la prochaine pulsation. L'article de blog de Resig est très bon.

5voto

José Cabo Points 480

Comportement des minuteries JavaScript (setTimeout) dans plusieurs scénarios.

  1. Lorsque le fil est libre et que le délai d'attente est écoulé : La minuterie est déclenchée immédiatement après le délai d'attente. Il peut y avoir une certaine imprécision d'environ 0 à 5 ms (scénario typique).
  2. Lorsque le fil est très occupé (boucle énorme) assez longtemps pour dépasser le délai de la minuterie : La minuterie sera exécutée immédiatement après que le fil soit libéré.
  3. Lorsqu'il y a une alerte : Même comportement que 2.
  4. Lorsque le fil est en pause parce que notre ordinateur portable est entré en veille : J'ai vu plusieurs choses. Mais le plus courant est la totale imprécision et l'ignorance du temps passé en veille.

Puisque les minuteries en JavaScript sont basées sur les ticks du processeur, et que le processeur est en veille, alors la minuterie est complètement mise en pause et reprise comme si 'rien ne s'était passé'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X