Wenn ich eine aktive Zeitüberschreitung habe, die eingestellt wurde var t = setTimeout("dosomething()", 5000)
,
Gibt es überhaupt eine Pause und Fortsetzung?
Gibt es eine Möglichkeit, die verbleibende Zeit für das aktuelle Zeitlimit abzurufen?
oder muss ich in einer Variablen, wenn das Timeout eingestellt ist, die aktuelle Zeit speichern, dann machen wir eine Pause, bekommen den Unterschied zwischen jetzt und dann?
javascript
timeout
Hagelholz
quelle
quelle
Antworten:
Sie könnten so einpacken
window.setTimeout
, was meiner Meinung nach dem ähnlich ist, was Sie in der Frage vorgeschlagen haben:quelle
setTimeout()
in Internet Explorer <= 9 nicht funktioniert.timer.resume(); timer.resume();
Sie zwei Timeouts parallel haben. Aus diesem Grund möchten Sie entwederclearTimeout(timerId)
zuerst oder zuif (timerId) return;
Beginn des Lebenslaufs einen Kurzschluss machen.var timerId, start, remaining;
außerhalb des Klassenbereichs undremaining = delay;
wieder innen hinzufügen , um den Parameter zu erfassen. Funktioniert wie ein Zauber tho!if (blah) { ... }
) oder so?So etwas sollte den Trick machen.
quelle
+new Date()
zu,new Date().getTime()
da es schneller ist: jsperf.com/date-vs-gettimeNein. Sie müssen es abbrechen (
clearTimeout
), die Zeit seit dem Start messen und mit der neuen Zeit neu starten.quelle
Eine leicht modifizierte Version der Antwort von Tim Downs . Da Tim jedoch meine Bearbeitung zurückgesetzt hat, muss ich dies selbst beantworten. Meine Lösung ermöglicht es, extra
arguments
als dritten (3, 4, 5 ...) Parameter zu verwenden und den Timer zu löschen:Wie Tim erwähnt hat, sind zusätzliche Parameter in nicht verfügbar
IE lt 9
, aber ich habe ein bisschen herumgearbeitet, damit es auch in funktioniertoldIE
.Verwendung:
new Timer(Function, Number, arg1, arg2, arg3...)
quelle
"Pause" und "Lebenslauf" machen im Kontext von nicht viel Sinn
setTimeout
, was eine einmalige Sache ist. Meinst dusetInterval
? Wenn ja, nein, Sie können es nicht anhalten, sondern nur abbrechen (clearInterval
) und dann erneut planen. Details von all dies im Timer Abschnitt der Spezifikation.quelle
Das Timeout war leicht genug, um eine Lösung zu finden, aber das Intervall war etwas kniffliger.
Ich habe mir die folgenden zwei Klassen ausgedacht, um dieses Problem zu lösen:
Diese können als solche implementiert werden:
In diesem Beispiel wird ein pausierbares Timeout (pt_hey) festgelegt, das nach zwei Sekunden "hey" alarmieren soll. Ein weiteres Timeout pausiert pt_hey nach einer Sekunde. Ein drittes Timeout setzt pt_hey nach zwei Sekunden fort. pt_hey wird eine Sekunde lang ausgeführt, eine Sekunde lang angehalten und dann fortgesetzt. pt_hey wird nach drei Sekunden ausgelöst.
Nun zu den schwierigeren Intervallen
In diesem Beispiel wird ein pausierbares Intervall (pi_hey) festgelegt, um alle zwei Sekunden "Hallo Welt" in die Konsole zu schreiben. Eine Zeitüberschreitung pausiert pi_hey nach fünf Sekunden. Ein weiteres Timeout setzt pi_hey nach sechs Sekunden fort. Pi_hey wird also zweimal ausgelöst, eine Sekunde lang ausgeführt, eine Sekunde lang angehalten, eine Sekunde lang ausgeführt und dann alle 2 Sekunden weiter ausgelöst.
ANDERE FUNKTIONEN
clearTimeout () und clearInterval ()
pt_hey.clearTimeout();
undpi_hey.clearInterval();
dienen als einfache Möglichkeit, Zeitüberschreitungen und Intervalle zu löschen.getTimeLeft ()
pt_hey.getTimeLeft();
undpi_hey.getTimeLeft();
gibt zurück, wie viele Millisekunden bis der nächste Trigger geplant ist.quelle
setInterval
? Ich denke, ein einfacherif(!true) return;
wird den Trick machen, oder irre ich mich?Ich musste die verstrichene und verbleibende Zeit berechnen, um einen Fortschrittsbalken anzuzeigen. Es war nicht einfach, die akzeptierte Antwort zu verwenden. 'setInterval' ist für diese Aufgabe besser als 'setTimeout'. Also habe ich diese Timer-Klasse erstellt, die Sie in jedem Projekt verwenden können.
https://jsfiddle.net/ashraffayad/t0mmv853/
quelle
/beleben
ES6-Version mit syntaktischem Zucker der Klasse y 💋
(leicht modifiziert: start () hinzugefügt)
quelle
Sie könnten in clearTimeout () schauen
oder Pause in Abhängigkeit von einer globalen Variablen, die festgelegt wird, wenn eine bestimmte Bedingung erfüllt ist. Wie ein Knopf gedrückt wird.
quelle
Sie können es auch mit Ereignissen implementieren.
Anstatt die Zeitdifferenz zu berechnen, starten und beenden Sie das Abhören eines Tick-Ereignisses, das im Hintergrund ausgeführt wird:
quelle
Wenn Sie ohnehin jquery verwenden, lesen Sie das Plugin $ .doTimeout . Diese Sache ist eine enorme Verbesserung gegenüber setTimeout, einschließlich der Möglichkeit, Ihre Zeitüberschreitungen mit einer einzelnen Zeichenfolgen-ID zu verfolgen, die Sie angeben und die sich nicht jedes Mal ändert, wenn Sie sie festlegen, und einfaches Abbrechen, Abrufen von Schleifen und Entprellen zu implementieren Mehr. Eines meiner am häufigsten verwendeten JQuery-Plugins.
Leider wird Pause / Resume nicht sofort unterstützt. Dazu müssten Sie $ .doTimeout umbrechen oder erweitern, vermutlich ähnlich wie bei der akzeptierten Antwort.
quelle
Ich musste in der Lage sein, setTimeout () für eine Diashow-ähnliche Funktion anzuhalten.
Hier ist meine eigene Implementierung eines pausierbaren Timers. Es integriert Kommentare zu Tim Downs Antwort, wie z. B. eine bessere Pause (Kernel-Kommentar) und eine Form des Prototyping (Umur Gediks Kommentar).
Beispiel:
Um den Code zu testen, verwenden Sie
timer.resume()
undtimer.pause()
einige Male und überprüfen Sie, wie viel Zeit noch übrig ist. (Stellen Sie sicher, dass Ihre Konsole geöffnet ist.)Die Verwendung dieses Objekts anstelle von setTimeout () ist so einfach wie das Ersetzen
timerID = setTimeout( mycallback, 1000)
durchtimer = new Timer( mycallback, 1000 )
. Danntimer.pause()
undtimer.resume()
stehen Ihnen zur Verfügung.quelle
"asynchrone" Arbeitsdemo unter: site zarsoft.info
quelle
Typoskript-Implementierung basierend auf der am besten bewerteten Antwort
quelle
Sie können wie folgt vorgehen, um setTimeout auf der Serverseite pausierbar zu machen (Node.js)
und Sie können es wie unten überprüfen
quelle
Ich glaube nicht, dass Sie etwas Besseres als clearTimeout finden werden . Auf jeden Fall können Sie später jederzeit ein anderes Timeout einplanen, anstatt es wieder aufzunehmen.
quelle
Wenn Sie mehrere Divs ausblenden müssen, können Sie einen
setInterval
und mehrere Zyklen verwenden, um Folgendes zu tun:quelle