Ich schreibe Javascript, das mit Bibliothekscode interagiert, den ich nicht besitze und den ich (vernünftigerweise) nicht ändern kann. Es werden Javascript-Zeitüberschreitungen erstellt, mit denen die nächste Frage in einer Reihe von zeitlich begrenzten Fragen angezeigt wird. Dies ist kein richtiger Code, da er hoffnungslos verschleiert ist. Folgendes macht die Bibliothek:
....
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = setTimeout( showNextQuestion(questions[i+1]), t );
Ich möchte einen Fortschrittsbalken auf dem Bildschirm anzeigen, der sich questionTime * 1000
durch Abfragen des von erstellten Timers füllt setTimeout
. Das einzige Problem ist, es scheint keine Möglichkeit zu geben, dies zu tun. Gibt es eine getTimeout
Funktion, die mir fehlt? Die einzigen Informationen zu Javascript-Zeitüberschreitungen, die ich finden kann, beziehen sich nur auf das Erstellen über setTimeout( function, time)
und das Löschen über clearTimeout( id )
.
Ich suche nach einer Funktion, die entweder die verbleibende Zeit vor dem Auslösen eines Timeouts oder die nach dem Aufrufen eines Timeouts verstrichene Zeit zurückgibt. Mein Fortschritts-Barcode sieht folgendermaßen aus:
var timeleft = getTimeout( test.currentTimeout ); // I don't know how to do this
var $bar = $('.control .bar');
while ( timeleft > 1 ) {
$bar.width(timeleft / test.defaultQuestionTime * 1000);
}
tl; dr: Wie finde ich die verbleibende Zeit vor einem Javascript setTimeout ()?
Hier ist die Lösung, die ich jetzt verwende. Ich ging durch den Bibliotheksbereich, der für Tests zuständig ist, und entschlüsselte den Code (schrecklich und gegen meine Berechtigungen).
// setup a timeout to go to the next question based on user-supplied time
var t = questionTime * 1000
test.currentTimeout = mySetTimeout( showNextQuestion(questions[i+1]), t );
und hier ist mein Code:
// Wrapper für setTimeout Funktion mySetTimeout (func, timeout) { timeouts [n = setTimeout (func, timeout)] = { start: neues Datum (). getTime (), Ende: neues Datum (). getTime () + Zeitüberschreitung t: Zeitüberschreitung }} return n; }}
Dies funktioniert in jedem Browser, der nicht IE 6 ist, ziemlich genau. Sogar auf dem ursprünglichen iPhone, auf dem ich erwartet hatte, dass die Dinge asynchron werden.
quelle
Nur für die Aufzeichnung gibt es eine Möglichkeit, die verbleibende Zeit in node.js abzurufen:
Drucke:
Dies scheint in Firefox nicht durch zu funktionieren, aber da node.js Javascript ist, dachte ich, dass diese Bemerkung für Leute hilfreich sein könnte, die nach der Node-Lösung suchen.
quelle
getTime()
ist entfernt,_idleStart
ist schon die ZeitEDIT: Ich denke tatsächlich, ich habe eine noch bessere gemacht: https://stackoverflow.com/a/36389263/2378102
Ich habe diese Funktion geschrieben und benutze sie oft:
Machen Sie einen Timer:
Wenn Sie also die verbleibende Zeit haben möchten, tun Sie einfach:
quelle
Die Event-Stacks von Javascript funktionieren nicht so, wie Sie denken würden.
Wenn ein Timeout-Ereignis erstellt wird, wird es der Ereigniswarteschlange hinzugefügt. Andere Ereignisse können jedoch Vorrang haben, während dieses Ereignis ausgelöst wird, die Ausführungszeit verzögern und die Laufzeit verschieben.
Beispiel: Sie erstellen eine Zeitüberschreitung mit einer Verzögerung von 10 Sekunden, um auf den Bildschirm aufmerksam zu machen. Es wird dem Ereignisstapel hinzugefügt und ausgeführt, nachdem alle aktuellen Ereignisse ausgelöst wurden (was zu Verzögerungen führt). Wenn das Zeitlimit verarbeitet wird, erfasst der Browser weiterhin andere Ereignisse und fügt sie dem Stapel hinzu, was zu weiteren Verzögerungen bei der Verarbeitung führt. Wenn der Benutzer klickt oder viel Strg + tippt, haben seine Ereignisse Vorrang vor dem aktuellen Stapel. Ihre 10 Sekunden können zu 15 Sekunden oder länger werden.
Davon abgesehen gibt es viele Möglichkeiten, um zu fälschen, wie viel Zeit vergangen ist. Eine Möglichkeit besteht darin, ein setInterval direkt nach dem Hinzufügen des setTimeout zum Stapel auszuführen.
Beispiel: Führen Sie ein Settimeout mit einer Verzögerung von 10 Sekunden durch (speichern Sie diese Verzögerung in einem globalen Format). Führen Sie dann ein setInterval aus, das jede Sekunde ausgeführt wird, um 1 von der Verzögerung zu subtrahieren und die verbleibende Verzögerung auszugeben. Aufgrund der Art und Weise, wie der Ereignisstapel die tatsächliche Zeit beeinflussen kann (siehe oben), ist dies immer noch nicht genau, gibt jedoch eine Zählung an.
Kurz gesagt, es gibt keinen wirklichen Weg, um die verbleibende Zeit zu bekommen. Es gibt nur Möglichkeiten, dem Benutzer eine Schätzung zu übermitteln.
quelle
Serverseitige Node.js spezifisch
Keines der oben genannten Verfahren hat bei mir wirklich funktioniert, und nach der Überprüfung des Timeout-Objekts sah es so aus, als ob alles relativ zu dem Zeitpunkt war, an dem der Prozess gestartet wurde. Folgendes hat bei mir funktioniert:
Ausgabe:
Die Ausgabe wurde der Kürze halber bearbeitet, aber diese Grundfunktion gibt eine ungefähre Zeit bis zur Ausführung oder seit der Ausführung an. Wie andere erwähnen, ist nichts davon aufgrund der Art und Weise, wie der Knoten verarbeitet wird, genau. Wenn ich jedoch eine Anforderung unterdrücken möchte, die vor weniger als einer Minute ausgeführt wurde, und den Timer gespeichert habe, verstehe ich nicht, warum dies nicht der Fall ist Arbeit als schnelle Überprüfung. Könnte interessant sein, Objekte mit Refreshtimer in 10.2+ zu jonglieren.
quelle
Sie können ändern
setTimeout
jedes Timeout der Endzeit in einer Karte zu speichern und eine Funktion erstellen , genanntgetTimeout
die Zeit , um nach links auf eine Zeitüberschreitung mit einer bestimmten ID.Dies war die Lösung von Super , aber ich habe sie so geändert, dass sie etwas weniger Speicher benötigt
Verwendung:
Hier ist eine verkleinerte Version dieses
getTimeout
IIFE :Ich hoffe, das ist für Sie genauso nützlich wie für mich! :) :)
quelle
Nein, aber Sie können Ihr eigenes setTimeout / setInterval für die Animation in Ihrer Funktion haben.
Angenommen, Ihre Frage sieht folgendermaßen aus:
Und Ihre Animation wird von diesen 2 Funktionen verwaltet:
quelle
Wenn jemand darauf zurückblickt. Ich habe einen Timeout- und Intervall-Manager herausgebracht, mit dem Sie die verbleibende Zeit in einem Timeout oder Intervall ermitteln und einige andere Aufgaben erledigen können. Ich werde es ergänzen, um es geschickter und genauer zu machen, aber es scheint ziemlich gut zu funktionieren (obwohl ich noch einige Ideen habe, um es noch genauer zu machen):
https://github.com/vhmth/Tock
quelle
Die Frage wurde bereits beantwortet, aber ich werde mein Bit hinzufügen. Es ist mir gerade eingefallen.
Verwenden Sie
setTimeout
inrecursion
wie folgt:Ich denke, der Code ist selbsterklärend
quelle
Überprüfen Sie dieses:
Machen Sie einen Timer:
Holen Sie sich bleiben:
Zeitüberschreitung löschen
quelle
quelle
Ich habe hier nach dieser Antwort gesucht, aber mein Problem überlegt. Wenn Sie hier sind, weil Sie nur die Zeit verfolgen müssen, während Sie setTimeout ausführen, haben Sie folgende Möglichkeit:
quelle
Ein schneller und einfacher Weg:
Sie können die verbleibende Zeit erhalten mit:
quelle