Javascript While loop pausieren?
Hi, ich möchte nach jedem While durchgang kurz pausieren, wie mache ich das? Ich hab auf Stackoverflow folgendes gefunden:
function delay(ms) {
var cur_d = new Date();
var cur_ticks = cur_d.getTime();
var ms_passed = 0;
while(ms_passed < ms) {
var d = new Date(); // Possible memory leak?
var ticks = d.getTime();
ms_passed = ticks - cur_ticks;
// d = null; // Prevent memory leak?
}
}
wenn ich jetzt:
while(true){
delay(200);
//mach was
}
benutze, dann wartet er 200ms und schickt dann alle iterationen auf einmal ab.
Wieso macht er das? Gibt es einen anderen weg, wie man nach jedem durchgang z.b. 200ms wartet?
2 Antworten
Deine delay-Funktion kannst du noch kürzer schreiben. Das von Stackoverflow ist sehr idiotensicher gehalten. Hier eine verkürzte Schreibweise:
function delay(ms){
var start_tick = +new Date,
ms_passed = 0;
while (ms_passed < ms)
ms_passed = +new Date - start_tick;
}
Bei mir hat dein Beispiel aber auch so funktioniert, wie es sein soll:
while(1){
delay(200);
console.log('.');
}
Alle 200 Millisekunden wurde ein Punkt geloggt. So eine delay-funktion und ein while(1) ist in JavaScript aber zu vermeiden, da es eine Event basierte Programmiersprache ist und so etwas die komplette Seite anhalten würde. Dafür gibt es asyncrone alternativen, wie schon von den anderen erwähnt wurde.
Beispiel mit setInterval und setTimeout:
// mit setInterval
// 10 mal mit 200ms Verzögerung ausführen
(function(){
var i = 0;
var intID = setInterval(function(){
if (++i >= 10)
clearInterval(intID);
// irgendetwas dass 10 mal ausgeführt werden soll
console.log('.');
}, 200);
})();
// mit setTimeout
// 10 mal mit 200ms Verzögerung ausführen
(function(){
var i = 0;
var toutID = setTimeout(function x(){
if (++i < 10)
toutID = setTimeout(x, 200);
// irgendwas dass 10 mal ausgeführt werden soll
console.log('.');
}, 200);
})();
Weil man immer noch eine Zählervariable (hier i) braucht, habe ich es immer in einen eigenen Namespace geschrieben (die wrapper-Funktion (function(){ ... })() ). So wird verhindert, dass sie überschrieben wird und Fehler entstehen, die nicht sehr leicht zu finden sind.
Liebe Grüße
Win7User
Wieso benutzt du nicht setTimeout(...) zum warten oder setInterval(...) zum ausführen alle x ms?
Nein. Dann könntest du das ganz ohne die Schleife lösen.
So erstellst du mehrere Timer die alle, alle 3 Sek. etwas machen.
damit wird alle 3 sekunden der loop wiederholt