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.

1voto

Miscreant Punkte 5736

Um es zusammenzufassen (wie es in den vorherigen Antworten gesagt wurde):

In JavaScript gibt es keine eingebaute Sleep-Funktion. Sie sollten die Funktion setTimeout o setIntervall um eine ähnliche Wirkung zu erzielen.

Wenn Sie es wirklich wollten, könnten Sie die Schlaffunktionalität mit einer pour Schleife wie die in der ursprünglichen Frage gezeigte, aber das würde Ihre CPU wie verrückt arbeiten lassen. Innerhalb eines Web Workers wäre eine alternative Lösung, eine synchrone XMLHttpRequest an eine nicht reagierende IP-Adresse und setzen Sie eine angemessene Zeitüberschreitung. Dies würde das Problem der CPU-Auslastung vermeiden. Hier ist ein Code-Beispiel:

// Works only inside a web worker

function sleep(milliseconds) {
    var req = new XMLHttpRequest();
    req.open("GET", "http://192.0.2.0/", false);
    req.timeout = milliseconds;
    try {
        req.send();
    } catch (ex) {

    }
}

console.log('Sleeping for 1 second...');
sleep(1000);
console.log('Slept!');

console.log('Sleeping for 5 seconds...')
sleep(5000);
console.log('Slept!');

1voto

JSideris Punkte 4743

Es gibt eine neue Bibliothek, Sequencr.js die Funktionen mit Zeitüberschreitungen ordentlich verkettet, so dass Sie die Callback-Hölle vermeiden können.

Es dreht sich das:

setTimeout(function(timeout){
    function1();
    setTimeout(function(timeout){
        function2();
        setTimeout(function(timeout){
            function3();
        }, timeout, timeout)
    }, timeout, timeout)
}, 10, 10);

in diese:

Sequencr.chain([function1, function2, function3], 10);

Und hat integrierte Unterstützung für Schleifen, die zwischen jeder Iteration "schlafen".

1voto

O_Z Punkte 1473

Das Problem bei den meisten Lösungen ist, dass sie den Stapel zurückspulen. Das kann in manchen Fällen ein großes Problem sein. In diesem Beispiel zeige ich, wie man Iteratoren auf eine andere Weise verwenden kann, um Folgendes zu simulieren echter Schlaf .

In diesem Beispiel ruft der Generator seine eigene next() Wenn sie also einmal in Gang gekommen ist, läuft sie von allein.

var h = a();
h.next().value.r = h; // That's how you run it. It is the best I came up with

// Sleep without breaking the stack!!!
function *a(){
    var obj = {};

    console.log("going to sleep....2s")

    setTimeout(function(){obj.r.next();}, 2000)
    yield obj;

    console.log("woke up");
    console.log("going to sleep no 2....2s")
    setTimeout(function(){obj.r.next();}, 2000)
    yield obj;

    console.log("woke up");
    console.log("going to sleep no 3....2s")

    setTimeout(function(){obj.r.next();}, 2000)
    yield obj;

    console.log("done");
}

1voto

Taulant Punkte 175

Das wird Ihnen genügen.

var reloadAfter = 10; //seconds
var intervalId = setTimeout(function() {
    //code you want to execute after the time waiting
}, reloadAfter * 1000); // 60000 = 60 sec = 1 min

1voto

Michael Erickson Punkte 3711

Eine Methode eines Objekts, das eine "Sleep"-Methode wie die folgende verwenden muss:

function SomeObject() {
    this.SomeProperty = "xxx";
    return this;
}
SomeObject.prototype.SomeMethod = function () {
    this.DoSomething1(arg1);
    sleep(500);
    this.DoSomething2(arg1);
}

Kann fast übersetzt werden mit:

function SomeObject() {
    this.SomeProperty = "xxx";
    return this;
}
SomeObject.prototype.SomeMethod = function (arg1) {
    var self = this;
    self.DoSomething1(arg1);
    setTimeout(function () {
        self.DoSomething2(arg1);
    }, 500);
}

Der Unterschied besteht darin, dass die Operation von "SomeMethod" zurückkehrt, bevor die Operation "DoSomething2" ausgeführt wird. Der Aufrufer von "SomeMethod" kann sich hierauf nicht verlassen. Da die "Sleep"-Methode nicht existiert, verwende ich die letztgenannte Methode und gestalte meinen Code entsprechend.

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