3847 Stimmen

Was ist die JavaScript-Version von sleep()?

Gibt es einen besseren Weg zur Entwicklung einer sleep in JavaScript als die folgenden pausecomp Funktion ( entnommen von hier )?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

Es handelt sich nicht um ein Duplikat von Sleep in JavaScript - Verzögerung zwischen Aktionen Ich möchte eine echter Schlaf in der Mitte einer Funktion und nicht eine Verzögerung, bevor ein Teil des Codes ausgeführt wird.

-2voto

Ronald Davis Punkte 21

Hier ist eine Möglichkeit, in einem .hta Skript, so dass das Skript beim Aufwachen den nächsten Befehl der Reihe nach ausführt, wie es in einer Schleife erforderlich ist. Dies ist ein echter Ruhezustand, bei dem der Prozessor nicht beschäftigt ist. So kann der Prozessor während des Ruhezustands beispielsweise Seiten herunterladen und rendern.

Nur einmal, am Anfang des Codes, gehen Sie

var WSHShell = new ActiveXObject ("WScript.Shell");

Für einen Sleep von z.B. 1 Sekunde = 1000 Millisekunden führen Sie die Anweisung

WSHShell.Run('Sleep.js 1000', 3, true);

In demselben Verzeichnis wie das Skript befindet sich die Datei Sleep.js der die folgende Zeile enthält:

WScript.Sleep(WScript.Arguments (0));

(Achtung! 0 steht in Klammern, nicht in Klammern.) Letztere ist die Zeile, die den Schlafvorgang tatsächlich ausführt. Das Argument true im vorangegangenen Schnipsel macht den Aufruf synchron. Die 3 im vorangehenden Argument scheint keine Auswirkungen zu haben, aber Sie brauchen ein Argument, damit true ist das dritte Argument.

Microsoft sagt: "Das WScript-Objekt ... muss nie instanziiert werden, bevor seine Eigenschaften und Methoden aufgerufen werden, und es ist immer von jeder Skriptdatei aus verfügbar", aber das stimmt nicht. Es ist verfügbar in einem eigenständigen .js Datei wie der oben genannten, aber offenbar nicht in einer .js Datei, die von einer .hta Datei, deshalb muss sie in einer separaten Datei stehen, die wie oben aufgerufen wird.

-2voto

MUY Belgium Punkte 2162

Eine sehr einfache Art, Schlaf zu machen, die sera mit allem kompatibel sein, auf dem JavaScript läuft... Dieser Code wurde mit etwa 500 Einträgen getestet, und die CPU- und Speichernutzung ist in meinen Webbrowsern immer noch nicht sichtbar.

Hier ist eine Funktion, die wartet, bis der Knoten sichtbar wird...

Diese Funktion erstellt einen neuen Kontext function () {} um eine Rekursion zu vermeiden. Wir haben den Code, der dasselbe tut wie der Code des Aufrufers, in diesen neuen Kontext gestellt. Wir verwenden die Funktion Timeout um unsere Funktion nach ein paar Zeitsekunden aufzurufen.

var get_hyper = function(node, maxcount, only_relation) {
    if (node.offsetParent === null) {
        // node is hidden
        setTimeout(function () { get_hyper(node, maxcount, only_relation)}, 
                   1000);
        return;
    };

    // Enter the code here that waits for that node becoming visible
    // before getting executed.

};

-2voto

Franz Kiermaier Punkte 367

Ich hatte ein ähnliches Problem, ich musste auf das Vorhandensein von Kontrollen warten und in Intervallen überprüfen. Da es kein echtes sleep, wait oder pause in JavaScript gibt und await / async im Internet Explorer nicht richtig unterstützt wird, habe ich eine Lösung mit setTimeOut und Injektion der Funktion bei erfolgreichem Finden des Elements gefunden. Hier ist der komplette Beispielcode, so dass jeder ihn reproduzieren und für sein eigenes Projekt verwenden kann:

<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script type="text/javascript">
        var ElementSearchStatus = {
            None: 0,
            Found: 1,
            NotFound: 2,
            Timeout: 3
        };

        var maxTimeout = 5;
        var timeoutMiliseconds = 1000;

        function waitForElement(elementId, count, timeout, onSuccessFunction) {
            ++count;
            var elementSearchStatus = existsElement(elementId, count, timeout);
            if (elementSearchStatus == ElementSearchStatus.None) {
                window.setTimeout(waitForElement, timeoutMiliseconds, elementId, count, timeout, onSuccessFunction);
            }
            else {
                if (elementSearchStatus == ElementSearchStatus.Found) {
                    onSuccessFunction();
                }
            }
        }

        function existsElement(elementId, count, timeout) {
            var foundElements = $("#" + elementId);
            if (foundElements.length > 0 || count > timeout) {
                if (foundElements.length > 0) {
                    console.log(elementId + " found");
                    return ElementSearchStatus.Found;
                }
                else {
                    console.log("Search for " + elementId + " timed out after " + count + " tries.");
                    return ElementSearchStatus.Timeout;
                }
            }
            else {
                console.log("waiting for " + elementId + " after " + count + " of " + timeout);
                return ElementSearchStatus.None;
            }
        }

        function main() {
            waitForElement("StartButton", 0, maxTimeout, function () {
                console.log("found StartButton!");
                DoOtherStuff("StartButton2")
            });
        }

        function DoOtherStuff(elementId) {
            waitForElement(elementId, 0, maxTimeout, function () {
                console.log("found " + elementId);
                DoOtherStuff("StartButton3");
            });
        }
    </script>
</head>
<body>
    <button type="button" id="StartButton" onclick="main();">Start Test</button>
    <button type="button" id="StartButton2" onclick="alert('Hey ya Start Button 2');">Show alert</button>
</body>
</html>

-2voto

Paul Stettler Punkte 1

JavaScript Funktionen erlaubt keine Aussetzung. Bei synchronem JavaScript werden Prozeduren implementiert. Prozeduren warten auf E/A-Operationen und Sleep-Timeouts. Sie sind für JavaScript 1.7 verfügbar.

Demos:

-2voto

Aistis Punkte 3272

Ein anderer Weg ist möglich:

var _timer;
clearTimeout(_timer);
_timer = setTimeout(function() {
    // Your code
}, 1000); // Delay for 1 s.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X