Angenommen, ich mache in einem modernen Webbrowser eine setTimeout
10-minütige (um 12:00 Uhr) und 5 Minuten später den Computer in den Ruhezustand. Was soll passieren, wenn das System wieder aufwacht? Was passiert, wenn es aufwacht, bevor die 10 Minuten abgelaufen sind (um 12:09 Uhr) oder viel später (um 16:00 Uhr)?
Der Grund, den ich frage, ist, dass ich alle 10 Minuten ein neues Authentifizierungstoken anfordern möchte und ich nicht sicher bin, ob der Browser das Richtige tut und sofort ein neues Token anfordert, wenn es nach langer Zeit aufwacht Zeit.
Präzisierungen : Ich wan't nicht zu verwenden Cookies - Ich versuche hier einen Web - Service zu bauen; und ja, der Server lehnt alte und ungültige Token ab.
javascript
settimeout
Sudhir Jonathan
quelle
quelle
Antworten:
Soweit ich getestet habe, stoppt es einfach und wird fortgesetzt, nachdem der Computer aufgewacht ist. Ich nehme an, das bedeutet für eine Sitzung, abhängig vom
setTimeout/Interval
Zähler, ab dem Zeitpunkt, an dem der Computer eingeschlafen ist.Ich denke nicht, dass Sie sich auf die Genauigkeit
setTimeout/Interval
zeitkritischer Dinge verlassen sollten. Bei Google Chrome habe ich kürzlich festgestellt, dass jedes Timeout / Intervall (das kürzer als 1s ist) auf einmal pro Sekunde verlangsamt wird, wenn der Tab, auf dem es aktiviert ist, den Fokus verliert.Abgesehen davon hängt die Genauigkeit von Zeitüberschreitungen / Intervallen von anderen laufenden Funktionen usw. ab. Kurz gesagt: Sie ist nicht sehr genau.
Wenn Sie also Intervalle und Zeitüberschreitungen verwenden und die Zeit mit einer Startzeit innerhalb der von ihr gestarteten Funktion vergleichen, erhalten Sie eine bessere Genauigkeit. Wenn Sie jetzt um 12:00 Uhr beginnen, geht der Computer in den Ruhezustand und wacht um 16:13 Uhr auf. Wenn Sie 16:13 Uhr gegen 12:00 Uhr prüfen, sind Sie sicher, dass Sie den Token erneuern müssen. Ein Beispiel für die Verwendung des Zeitvergleichs finden Sie hier
quelle
the counter ticks on from the time the computer fell asleep.
<- auch meine Erfahrung.Vergleichen Sie die aktuelle Datums- und Uhrzeitangabe mit der Datums- und Uhrzeitangabe beim Laden der Seite wie folgt:
//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);
quelle
Hier ist mein Code:
<!doctype html> <html> <body> <input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout('alert(\'Surprise!\')', 120000)"/> </body> <script> </script> </html>
Ich habe drei Szenarien genommen, die die Frage beantworten könnten.
Szenario 1: Klicken Sie um 00 Sekunden auf die Schaltfläche "Timer starten". Nach 25 Sekunden schläft der Computer ein. Nach 1 Minute 40 Sekunden Computer aufwecken. Nach 2 Minuten wird eine Warnung angezeigt.
Szenario 2: Klicken Sie um 00 Sekunden auf die Schaltfläche "Timer starten". Nach 26 Sekunden schläft der Computer ein. Nach 3 Minuten wecke ich den Computer. Der Alarm wird angezeigt.
Szenario 3: Dieser ist wirklich erstaunlich.
<input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout('alert(\'Surprise!\')', 600000)"/>
Um 00 Sekunden klicke ich auf die Schaltfläche 'Timer starten'. Nach ca. 1 Minute und 30 Sekunden befindet sich der Computer im Ruhezustand (mein PC benötigt eine Minute, um den Ruhezustand einzuleiten).
Nach 8 Minuten schalte ich den Laptop ein. Genau nach 10 Minuten erscheint die Warnung.
PS: This is my first ever comment on Stack Exchange. I prefer to execute code and view results rather than infer from theory.
quelle
Das Verhalten basiert sowohl auf dem Browser als auch auf dem Betriebssystem. Das Betriebssystem behandelt den Ruhezustand und einzelne Apps berücksichtigen dies häufig nicht.
Was höchstwahrscheinlich passieren wird, ist, dass das Betriebssystem mit der gleichen Zeit auf dem Timer zurückkehrt, die beim Herunterfahren verbleibt. Die andere Möglichkeit ist, dass es überhaupt nicht feuert.
Wenn es wirklich ein Problem ist, möchten Sie wahrscheinlich besser auf Nummer sicher gehen und einen Zeitstempel für die Initialisierung des Tokens speichern und
setInterval
ihn regelmäßig überprüfen (z. B. zweimal pro Minute).Sicherheit sollte jedoch nicht nur eine clientseitige Angelegenheit sein. Stellen Sie sicher, dass Ihr Server einen Fehler auslöst, wenn ein altes / ungültiges Token verwendet wird, und dass sich der Ajax als Antwort angemessen verhält.
[Bearbeiten] Ich stimme dem anderen Beitrag zu, dass er beim nächsten Tick sofort ausgelöst werden könnte. Resigs Blogpost ist sehr gut.
quelle
Basierend auf Bens Antwort habe ich den folgenden Util erstellt. Sie können die Abtastdauer anpassen, ich verwende sie jedoch wie folgt für die Token-Aktualisierung:
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);
quelle
Verhalten von JavaScript-Timern (setTimeout) in mehreren Szenarien.
Da Timer in JavaScript auf CPU-Ticks basieren und die CPU im Ruhezustand ist, wird der Timer vollständig angehalten und als "da nichts passiert wäre" fortgesetzt.
quelle
In John Resigs Blog sollen die Timer "Wanduhr" verwenden. Ich glaube, dass die Ereignisse sofort nach der Wiederaufnahme der Maschine ausgelöst werden, da setTimeout () nicht garantiert, dass eine Ausführung ein bestimmter Zeitpunkt ist, sondern so bald wie möglich nach dem angegebenen Intervall. Ich habe es jedoch nicht selbst überprüft.
quelle