Javascript While loop pausieren?

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?

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

gamestar4124 
Fragesteller
 09.07.2019, 10:04
while (counter <= reps) {
    setInterval(function(){machwas; }, 3000);
    counter++;
  }

damit wird alle 3 sekunden der loop wiederholt

0
triopasi  09.07.2019, 10:06
@gamestar4124

Nein. Dann könntest du das ganz ohne die Schleife lösen.

So erstellst du mehrere Timer die alle, alle 3 Sek. etwas machen.

2