2009-09-19 11 views

Antwort

158

Die einfache Antwort ist, dass es keine solche Funktion gibt.

Das nächste, was Sie haben, ist:

var millisecondsToWait = 500; 
setTimeout(function() { 
    // Whatever you want to do after the wait 
}, millisecondsToWait); 

Beachten Sie, dass besonders wollen nicht busy-wait (zB in einem Spin-Schleife), da Ihr Browser an Sicherheit grenzender Wahrscheinlichkeit in Ihrem JavaScript ausführen Eine Single-Thread-Umgebung.

Hier sind ein paar andere SO Fragen, die mit Fäden in JavaScript umgehen:

Und diese Frage kann auch hilfreich sein:

+1

(+1) siehe setTimeout() und setInterval() in Javascript –

+7

Um gute Programmierpraktiken zu fördern, ist es am besten, ein Semikolon nach "500" einzufügen und "MillisekundenToWait" im Codebeispiel zu initialisieren (zB durch vorheriges es mit "var") (auf diese Weise, wenn jemand das Sample kopiert und fügt sie nicht mit einem implizierten globalen enden). –

+0

Guter Fang, Steve. Ich habe meine Antwort bearbeitet, um Ihre Kommentare zu reflektieren. –

2

können Sie entweder eine Spinschleife (eine Schleife, die für eine lange Zeit eine Art von Berechnung, die die Funktion zu verzögern nur Schleifen) schreiben oder -nutzung:

setTimeout("Func1()", 3000); 

Dies ruft ‚Func1() 'nach 3 Sekunden.

Edit:

Kredit geht an die commenters, aber Sie können anonyme Funktionen setTimeout passieren.

setTimeout(function() { 
    //Do some stuff here 
}, 3000); 

Dies ist viel effizienter und ruft die Eval-Funktion von Javascript nicht auf.

+0

Ich möchte den aktuellen Thread in den Wartestatus für die angegebene Anzahl von Sekunden gehen – Niger

+0

Spinning eine Schleife cau se Hohe CPU-Auslastung. – Niger

+0

Ich würde es vorziehen, die Funktion direkt als ein Argument bereitzustellen, anstatt den Funktionsnamen anzugeben: setTimeout (function() {...}, 3000); – tvanfosson

7

Es gibt keine direkte Entsprechung, da es eine Webseite pausieren würde. Allerdings gibt es eine setTimeout(), zB:

function doSomething() { 
    thing = thing + 1; 
    setTimeout(doSomething, 500); 
} 

Closure Beispiel (Danke Daniel):

function doSomething(val) { 
    thing = thing + 1; 
    setTimeout(function() { doSomething(val) }, 500); 
} 

Das zweite Argument ist Millisekunden vor dem Brennen, können Sie dies für Zeitereignisse verwenden oder zu warten, bevor die Durchführung einer Operation .

Bearbeiten: Aktualisiert basierend auf Kommentare für ein saubereres Ergebnis.

0

Oder vielleicht können Sie die setInterval-Funktion verwenden, um eine bestimmte Funktion nach der angegebenen Anzahl von Millisekunden aufzurufen. Mach einfach einen google für den setInterval-Prototyp. Ich erinnere mich nicht genau daran.

39

Versuchen Sie es mit diesem Code. Ich hoffe, es ist nützlich für dich.

function sleep(seconds) 
{ 
    var e = new Date().getTime() + (seconds * 1000); 
    while (new Date().getTime() <= e) {} 
} 
+2

tut genau das, was es soll – maazza

+49

Dies legt den Thread nicht schlafen, es verbraucht nur den Thread mit verschwenderischen Berechnung, die wahrscheinlich die Benutzeroberfläche blockieren wird. Nicht empfohlen. – superdweebie

+11

Das ist ein "beschäftigt warten" a.k.a Sie sind "den Faden verbrennen" –

0

Dies half schließlich mir:

var x = 0; 
    var buttonText = 'LOADING'; 

    $('#startbutton').click(function(){ 
     $(this).text(buttonText); 
     window.setTimeout(addDotToButton,2000); 
    }) 

    function addDotToButton(){ 
     x++; 
     buttonText += '.'; 
     $('#startbutton').text(buttonText); 

     if (x < 4) window.setTimeout(addDotToButton, 2000); 
     else location.reload(true); 
    } 
+3

setTimeout wurde schon vor langer Zeit erwähnt. und der Rest des Codes hat nichts mit der Frage zu tun. – AbcAeffchen

1

SetTimeout würde nicht halten und aber Thread.sleep tut auf Ihrem eigenen Thread wieder aufzunehmen. Es gibt keine tatsächliche Gleichheit in Javascript

4

Angenommen, Sie können ECMAScript 2017 verwenden, können Sie ähnliches Verhalten emulieren, indem Sie async/await und setTimeout verwenden. Hier ist ein Beispiel Schlaffunktion:

async function sleep(msec) { 
    return new Promise(resolve => setTimeout(resolve, msec)); 
} 

Sie dann die Sleep-Funktion in jeder anderen async Funktion wie folgt verwendet werden:

async function testSleep() { 
    console.log("Waiting for 1 second..."); 
    await sleep(1000); 
    console.log("Waiting done."); // Called 1 second the first console.log 
} 

Das ist schön, weil es einen Rückruf vermeidet benötigen. Der Nachteil ist, dass es nur in asynchronen Funktionen verwendet werden kann. Hinter den Kulissen wird die Funktion testSleep angehalten und nach dem Ende des Schlafs wieder aufgenommen.

Von MDN:

Die erwarten Ausdruck async Funktionsausführung verursacht pausieren, bis ein Versprechen erfüllt oder abgelehnt wird, und nach Erfüllung der Ausführung der Asynchron Funktion fortzusetzen.

Für eine vollständige Erklärung finden Sie unter:

+1

Dies ist der empfohlene Ansatz im Jahr 2017 –