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.

14voto

Elo Punkte 1935

Ich würde setTimeOut in einer Promise für Codekonsistenz mit anderen asynchronen Aufgaben kapseln: Demo in Fiddle

function sleep(ms)
{
    return(new Promise(function(resolve, reject) {
        setTimeout(function() { resolve(); }, ms);
    }));
}

Er wird folgendermaßen verwendet:

sleep(2000).then(function() {
   // Do something
});

Die Syntax ist leicht zu merken, wenn Sie mit der Verwendung von Promises vertraut sind.

13voto

Gabriel Ratener Punkte 555

Die meisten der hier gegebenen Antworten sind falsch oder zumindest nicht mehr zeitgemäß. Es gibt keinen Grund, warum JavaScript single threaded sein muss, und das ist auch nicht der Fall. Heute unterstützen alle gängigen Browser Worker. Bevor dies der Fall war, wurden andere JavaScript-Laufzeiten wie Nashorn und Node.js unterstützten Multithreading.

JavaScript ist single threaded" ist keine gültige Antwort. Beispielsweise würde die Ausführung einer Sleep-Funktion innerhalb eines Workers den im UI-Thread laufenden Code nicht blockieren.

In neueren Laufzeiten, die Generatoren und Yield unterstützen, könnte man ähnliche Funktionen wie die sleep-Funktion in einer Singlethread-Umgebung einsetzen:

// This is based on the latest ES6 drafts.
// JavaScript 1.7+ (SpiderMonkey/Firefox 2+) syntax is slightly different

// Run code you want to sleep here (omit star if using JavaScript 1.7)
function* main(){
    for (var i = 0; i < 10; i++) {
        // To sleep for 10 milliseconds 10 times in a row
        yield 10;
    }

    yield 5;
    console.log('I just slept 5 milliseconds!');
}

// Resume the given generator after ms milliseconds
function resume(ms, generator){
    setTimeout(function(){
        // Omit .value if using JavaScript 1.7
        var nextSleep = generator.next().value;
        resume(nextSleep, generator);
    }, ms);
}

// Initialize a generator and get first sleep for the recursive function
var
    generator = main(),
    firstSleep = generator.next().value;

// Initialize recursive resume function
resume(firstSleep, generator);

Diese Imitation von sleep unterscheidet sich von einer echten sleep-Funktion, da sie den Thread nicht blockiert. Es ist einfach Zucker auf der aktuellen JavaScript setTimeout Funktion. Dieser Funktionstyp wurde implementiert in Aufgabe.js und sollte heute in Firefox funktionieren.

13voto

Homer6 Punkte 14461

Bei Browsern stimme ich zu, dass setTimeout und setInterval der richtige Weg sind.

Für serverseitigen Code kann jedoch eine blockierende Funktion erforderlich sein (z. B. um eine effektive Thread-Synchronisierung zu ermöglichen).

Wenn Sie Folgendes verwenden Node.js y Meteor haben Sie möglicherweise die Grenzen der Verwendung von setTimeout in einer Faser kennengelernt. Hier ist der Code für den Server-seitigen Schlaf.

var Fiber = require('fibers');

function sleep(ms) {
    var fiber = Fiber.current;
    setTimeout(function() {
        fiber.run();
    }, ms);
    Fiber.yield();
}

Fiber(function() {
    console.log('wait... ' + new Date);
    sleep(1000);
    console.log('ok... ' + new Date);
}).run();
console.log('back in main');

Siehe: Node.js Fasern, Schlaf

12voto

Harry Punkte 2675

Desde Node.js 7.6 können Sie die promisify Funktion aus der Utensilien Modul mit setTimeout .

const sleep = require('util').promisify(setTimeout)

Allgemeine Verwendung

async function main() {
    console.time("Slept for")
    await sleep(3000)
    console.timeEnd("Slept for")
}

main()

Frage Verwendung

async function asyncGenerator() {
    while (goOn) {
      var fileList = await listFiles(nextPageToken);
      await sleep(3000)
      var parents = await requestParents(fileList);
    }
  }

11voto

user207408 Punkte 81

Ich habe gesucht / gegoogelt ziemlich viele Webseiten auf JavaScript schlafen / warten... und es ist keine Antwort, wenn Sie JavaScript zu "RUN, DELAY, RUN" wollen... was die meisten Leute bekamen, war entweder, "RUN, RUN (nutzloses Zeug), RUN" oder "RUN, RUN + verzögerter RUN"...

Ich dachte: Hier ist eine Lösung, die funktioniert... aber du musst deine laufenden Codes zerhacken...: Ja, ich weiß, das ist nur ein leichter zu lesendes Refactoring... trotzdem...

Beispiel 1:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
// JavaScript sleep by "therealdealsince1982"; copyrighted 2009
// setInterval
var i = 0;

function run() {
    // Pieces of codes to run
    if (i == 0){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; }
    if (i == 1){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; }
    if (i == 2){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; }
    if (i >2){document.getElementById("id1").innerHTML= "<p>code segment " + i + " is ran</p>"; }
    if (i == 5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } // End interval, stops run
    i++; // Segment of code finished running, next...
}

run();
t = setInterval("run()", 1000);

</script>
</body>
</html>

Beispiel 2:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
// JavaScript sleep by "therealdealsince1982"; copyrighted 2009
// setTimeout
var i = 0;

function run() {
    // Pieces of codes to run, can use switch statement
    if (i == 0){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>"; sleep(1000);}
    if (i == 1){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>"; sleep(2000);}
    if (i == 2){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>"; sleep(3000);}
    if (i == 3){document.getElementById("id1").innerHTML= "<p>code segment " + i + " ran</p>";} //stops automatically
    i++;
}

function sleep(dur) {t=setTimeout("run()", dur);} // Starts flow control again after 'dur'

run(); // Starts
</script>
</body>
</html>

Beispiel 3:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
// JavaScript sleep by "therealdealsince1982"; copyrighted 2009
// setTimeout
var i = 0;

function flow() {
    run(i);
    i++; // Code segment finished running, increment i; can put elsewhere
    sleep(1000);
    if (i == 5) {clearTimeout(t);} // Stops flow, must be after sleep()
}

function run(segment) {
    // Pieces of codes to run, can use switch statement
    if (segment == 0){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    if (segment == 1){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    if (segment == 2){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
}

function sleep(dur) {t=setTimeout("flow()", dur);} // Starts flow control again after 'dur'

flow(); // Starts flow
</script>
</body>
</html>

Beispiel 4:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
// JavaScript sleep by "therealdealsince1982"; copyrighted 2009
// setTimeout, switch
var i = 0;

function flow() {
    switch(i)
    {
        case 0:
            run(i);
            sleep(1000);
            break;
        case 1:
            run(i);
            sleep(2000);
            break;
        case 5:
            run(i);
            clearTimeout(t); // Stops flow
            break;
        default:
            run(i);
            sleep(3000);
            break;
    }
}

function run(segment) {
    // Pieces of codes to run, can use switch statement
    if (segment == 0){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    if (segment == 1){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    if (segment == 2){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment " + segment + " is ran</p>"; }
    i++; // Current segment of code finished running, next...
}

function sleep(dur) {t=setTimeout("flow()", dur);} // Starts flow control again after 'dur'

flow(); // Starts flow control for first time...
</script>
</body>
</html>

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