Diese Funktion funktioniert nicht so, wie ich es möchte. Als JS-Neuling kann ich nicht herausfinden, warum.
Ich brauche es, um 5 Sekunden zu warten, bevor ich prüfe, ob das newState
ist -1
.
Derzeit wartet es nicht, es überprüft nur sofort.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
javascript
dom-events
Copyflake
quelle
quelle
Antworten:
Sie müssen Ihren Code in die Rückruffunktion eingeben, die Sie bereitstellen an
setTimeout
:Jeder andere Code wird sofort ausgeführt.
quelle
Sie sollten dies wirklich nicht tun . Die korrekte Verwendung des Timeouts ist das richtige Werkzeug für das Problem des OP und für jede andere Gelegenheit, bei der Sie nach einer bestimmten Zeit nur etwas ausführen möchten. Joseph Silber hat dies in seiner Antwort gut demonstriert. Wenn Sie jedoch in einem Fall außerhalb der Produktion den Haupt-Thread wirklich für einen bestimmten Zeitraum aufhängen möchten, ist dies ausreichend.
Mit Ausführung in der Form:
Ich bin hier angekommen, weil ich einen einfachen Testfall für die Sequenzierung einer Mischung aus asynchronen Operationen um lang laufende Blockierungsoperationen (dh teure DOM-Manipulation) erstellt habe. Dies ist meine simulierte Blockierungsoperation. Es passt gut zu diesem Job, also dachte ich, ich poste es für alle anderen, die mit einem ähnlichen Anwendungsfall hier ankommen. Trotzdem wird ein Date () -Objekt in einer while-Schleife erstellt, was den GC sehr überfordern kann, wenn er lange genug ausgeführt wird. Aber ich kann nicht genug betonen, dies ist nur zum Testen geeignet, um eine tatsächliche Funktionalität aufzubauen, die Sie auf Joseph Silbers Antwort verweisen sollten.
quelle
Hier ist eine Lösung mit der neuen Syntax async / await .
Überprüfen Sie unbedingt die Browserunterstützung, da dies eine neue Funktion ist, die mit ECMAScript 6 eingeführt wurde.
Dienstprogrammfunktion:
Verwendungszweck:
Der Vorteil dieses Ansatzes besteht darin, dass Ihr Code wie synchroner Code aussieht und sich verhält.
quelle
Verwenden Sie eine Verzögerungsfunktion wie folgt:
Verwendungszweck:
Credits: Wie kann der .keyup () - Handler verzögert werden, bis der Benutzer aufhört zu tippen?
quelle
Sie sollten nicht nur versuchen, 5 Sekunden in Javascript anzuhalten. Das funktioniert nicht so. Sie können festlegen, dass eine Codefunktion in 5 Sekunden ausgeführt wird. Sie müssen jedoch den Code, den Sie später ausführen möchten, in eine Funktion einfügen, und der Rest Ihres Codes nach dieser Funktion wird sofort weiter ausgeführt.
Zum Beispiel:
Aber wenn Sie Code wie diesen haben:
Die
console.log()
Anweisung wird sofort ausgeführt. Es wird nicht warten, bis das Timeout in derstateChange()
Funktion . Sie können die Ausführung von Javascript nicht einfach für einen festgelegten Zeitraum anhalten.Stattdessen muss sich jeder Code, für den Sie Verzögerungen ausführen möchten, innerhalb von befinden
setTimeout()
Rückruffunktion befinden (oder von dieser Funktion aufgerufen werden).Wenn Sie versucht haben, durch Schleifen "anzuhalten", haben Sie den Javascript-Interpreter im Wesentlichen für einen bestimmten Zeitraum "aufgehängt". Da Javascript Ihren Code nur in einem einzigen Thread ausführt, kann beim Schleifen nichts anderes ausgeführt werden (keine anderen Ereignishandler können aufgerufen werden). Das Schleifen, das darauf wartet, dass sich eine Variable ändert, funktioniert also nie, da kein anderer Code ausgeführt werden kann, um diese Variable zu ändern.
quelle
var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
Wenn Sie sich in einer asynchronen Funktion befinden , können Sie dies einfach in einer Zeile tun:
Beachten Sie , wenn das Ziel NodeJS ist, ist es effizienter, dies zu verwenden (es ist eine vordefinierte versprochene setTimeout-Funktion):
quelle
Versuche dies:
quelle
Der beste Weg, um eine solche Funktion für das Warten in Millisekunden zu erstellen, ist, dass diese Funktion auf die im Argument angegebenen Millisekunden wartet:
quelle
Basierend auf Joseph Silbers Antwort würde ich es so machen, ein bisschen allgemeiner.
Sie hätten Ihre Funktion (lassen Sie uns eine basierend auf der Frage erstellen):
Und Sie könnten eine Wartefunktion haben:
Am Ende hätten Sie:
Das ist eine Lösung, ich würde lieber keine Argumente in der Wartefunktion verwenden (nur
foo();
statt habenfoo(arg);
), aber das ist für das Beispiel.quelle
Diese Lösung stammt aus der Dokumentation von React Native für eine Aktualisierungssteuerung :
Um dies auf die Frage des OP anzuwenden, können Sie diese Funktion in Abstimmung mit
await
:quelle
Sie können Verzögerungen hinzufügen, indem Sie kleine Änderungen an Ihrer Funktion vornehmen (asynchron und warten).
quelle
mit anglejs:
quelle
Erstellen Sie eine neue Js-Funktion
Rufen Sie die Funktion auf, wenn Sie die Ausführung verzögern möchten. Verwenden Sie Millisekunden in int für den Verzögerungswert.
quelle
Ich habe es verwendet, um PC-Spiele von Edge oder IE auszuführen. Und es schließt IE Edge nach 7 Sekunden selbst.
Firefox und Google Chrome können nicht verwendet werden, um Spiele auf diese Weise zu starten.
quelle