2009-08-14 3 views
5

Ich möchte so etwas in Javascript.Gibt es eine gleichwertige Javascript- oder Jquery-Schlaffunktion?

for (i = 0; i < 10; i++) { 
    alert(i); 
    // now sleep 1 sec 
    sleep(1000); 
} 

ist dort ein eingebautes Javascript oder Jquery für dieses?

Vielen Dank!

+0

Das erste, was ich vor der Veröffentlichung tun würde, ist http://stackoverflow.com/search?q=[JavaScript ] + schlafen und Sie können sehen, es gibt viele Lösungen bereits – epascarello

+0

Das nächste Ding fragt sich, warum Sie einen Schlaf brauchen, und nicht eine ereignisbasierte Lösung wie Zoidberg schlägt. – xtofl

Antwort

5

ist es nicht so etwas, direkt. Sie müssten Javascript erklären, um etwas nach einiger Zeit mit setTimeout aufzuwecken.

Dieses 'Etwas' wäre der Code, den Sie ausführen möchten nach der Schlaf, natürlich.

Von einem Beispiel, das ich auf the internet gefunden:

function dothingswithsleep(part) { 
    if(part == 0) { 
     alert("before sleep"); 
     setTimeout(function() { dothingswithsleep(1); }, 1000); 
    } else if(part == 1) { 
     alert("after sleep"); 
    } 
} 

Aber das ist zerbrechlich Design. Sie überdenken Ihre Geschäftslogik wirklich zu machen Sie etwas nach einer Sekunde: rufen Sie eine andere Funktion auf, anstatt diese erfundenen Hilfsvariablen zu verwenden.

5

Verwendung

setTimeout

Methode

+0

Nur, dass setTimeout eine Fortsetzungsfunktion als Argument benötigt. – xtofl

+0

Ich habe versucht mit setTimeout, aber ich brauche keine Fortsetzungsfunktion. –

+0

Fortsetzung ist obligatorisch, wenn Sie PHP-ähnliches Verhalten möchten. setTimeout (runThisFunc(), after1sec) - im Gegensatz zu PHP wartet js nicht auf eine Zeile, bis die nächste ausgeführt wird. – Devrim

2

Erste Frage, warum möchten Sie in einer Schleife schlafen? Wenn dies erforderlich ist, sollte vielleicht ein Ereignissystem eingerichtet werden. Ich selbst habe die Schlaftaktik viele Male für Multi-threaded Javascript-Programmierung ausprobiert und festgestellt, dass es nicht gut funktioniert. Der beste Weg, Multi-Threading in Javascript durchzuführen, ist ein Event-System wie das von YUI oder fast jedem anderen Framework. Lassen Sie Ihren Hörer dieses Ereignis abonnieren und etwas tun, wann immer es auftritt. In diesen Ereignisrahmen haben Sie die volle Kontrolle darüber, wann Ihr eigenes benutzerdefiniertes Ereignis ausgelöst wird, also ist das keine große Sache.

Hier ist der Link für das Event-Framework des YUI.

http://developer.yahoo.com/yui/examples/event/index.html

Hier ist, wie es codiert werden könnte YUI mit

var myEvent = new YAHOO.util.CustomEvent('fooEvent'); 
// subscribe a function to be called (first param) inside the scope of an object 
// (second param). 
myEvent.subscribe(function() {alert(this.count++);},{count:0},true); 
setTimeout('myEvent.fire()',1000); 

Auf diese Weise, es zu tun ist viel sauberer und kompakter. Oder wenn Sie wollen ein Ereignis Rahmen nicht verwenden versuchen, diese

var myObj = { 
    count:0, 
    doSomething:function(){alert(this.count++);} 
    loopFunc:function(){ 
     this.doSomething(); 
     setTimeout('myObj.loopFunc()',1000); 
    } 
} 

, das bietet, was Sie brauchen, und seine kompakter.

Aber wenn Sie wirklich eine Schlaf-Funktion in Ihrem Code haben, dann würde ich empfehlen, einen synchronen Ajax-Aufruf zu einem einfachen Server-Skript. Dann können Sie den Code auf dem Server verwenden, um zu schlafen, wenn Sie möchten. Unten finden Sie einen Link zu einer Frage, die Ihnen zeigt, wie Sie einen synchronen Anruf tätigen können.

How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

Aber ich empfehle Ihnen für die setTimeout Weg gehen. Viel sauberer und Sie möchten wahrscheinlich keine serverseitigen Anrufe tätigen, wenn Sie es vermeiden können.

+0

Ich habe auch Rückrufe mit JS gemacht, und die eine Sache, die ich gelernt habe, ist, dass Ihr loopFunc mit 'this' alles außer Ihrem' myObj' aufgerufen wird. Sie müssen das erforderliche 'This 'in einem Verschluss irgendwie speichern. – xtofl

+0

Abgesehen davon ist Ihr Vorschlag, ereignisbasiert zu gehen, sehr viel wert! – xtofl

+0

Das zweite Beispiel sollte funktionieren, da der loopFunc innerhalb des Bereichs myObj ausgeführt wird. Dies sollte sich auf myObj beziehen, das einzige Problem, das ich nicht mag, ist, dass myObj eine global verfügbare Variable für die Ausführung von setTimeout sein muss, um es zu finden. Kannst du weiterfur erklären, was du mit "dies in einer Schließung" meinst? – Zoidberg

2

Ich habe viele Webseiten auf Javascript sleep/wait gegooglet/warten ...und es gibt KEINE Antwort, wenn Sie Javascript "RUN, DELAY, RUN" wollen ... was die meisten Leute bekamen, war entweder "RUN, RUN (nutzloses Zeug), RUN" oder "RUN, RUN + verzögerter RUN" ... ....

So aß ich ein paar Burger und bekam eine Lösung ::: hier denken ist, das funktioniert ... aber Sie Ihre laufenden Codes zerhacken müssen :::

// ... ...................................... // example1:

<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... 
} 

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

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

// .................................... // Beispiel2:

<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 flow 
</script> 
</body> 
</html> 
0
function sleep(delay) { 
    var start = new Date().getTime(); 
    while (new Date().getTime() < start + delay); 
} 
+4

Ein Standard-CPU-Brenner –

+2

Richtig; tu das nicht. – sosiouxme

+0

Was ist daran falsch? – aaronbauman

0

Nun, wenn Sie PHP auf dem Webserver installiert haben, können Sie $.load oder ähnliches verwenden, um eine PHP-Datei aufzurufen, die nur sleep(int) in sich hat ...

1

habe ich diesen Kommentar: „Ich habe versucht, setTimeout zu verwenden, aber ich brauche keine Fortsetzungsfunktion "und dachte, ja, tust du. Was Sie nicht brauchen, ist eine Schleife. Sie benötigen eine rekursive Funktion.

THIS

for (i = 0; i < 10; i++) { 
    alert(i); 
    // now sleep 1 sec 
    sleep(1000); 
} 

ÜBERSETZT ZU DIESEM

function recursive(i, max) 
{ 
    if (i > max) return; 
    alert(i); 
    i = i + 1; 
    setTimeout(function(){ recursive(i, max); }, 1000); 
} 

recursive(1, 10); 

Beispiel: http://jsfiddle.net/q76Qa/