wait w pętli synchronicznie wykonywanych poleceń

0

Kurszwrrr...

Czy w Javascripcie wynaleziono już może jakieś normalne wait do zatrzymania pętli na określony czas?
Coś w stylu:

for (x=1; x<=10; x++) {
  zrób a;
  zrób b;
  if (jakiś warunek) przerwij_wykonywanie_pętli_i_czekaj_przez(x); // milisekund
}
0

Dobra, znowu będę gadać sama ze sobą, ale wymyśliłam takie cudo:

<!DOCTYPE html>
<html>
<head>
  <title>tytul</title>
</head>
<body>

<div id="dane"></div>

<script>

function petla() {
  document.getElementById("dane").innerHTML+=x+" ";
  x++;
  if (x<=xz) {
   if  (x==5) setTimeout(petla, t);
   else petla();
  }
}


xa=1;   // licz od
xz=10;  // licz do
x=1;    // aktualny licznik
t=3000; // czas opóźnienia


petla();

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

Ma ktoś pomysł, jak to ew. zrobić ładniej i prościej?

0

Odchudzona i doludziona wersja:

function petla(x, ile) {
  document.getElementById("dane").innerHTML+=x+" ";
  x++;
  if (x<=ile) {
   if  (x==5) setTimeout(function(){ petla(x, ile); }, 3000);
   else petla(x, ile);
  }
}

petla(1, 10);

Dobra, to już jest chyba używalne, ale jak ktoś ma lepsze pomysły, to nie pogardzę.

0

Ale co chcesz tak naprawdę osiągnąć? (rozumiem, że to jest jakiś środek do celu, a jaki jest cel?)

1

Thread.sleepa w JavaScripcie nie ma.

To co napisałaś możesz opakować w abstrakcje typu Promise czy async/ await.

0

Prosty robot internetowy.
Skrypt ma wykonywać sekwencje operacji na obcych stronach (wiem Same-origin policy, ale to jest akurat do obejścia na różne sposoby).
No i przeważnie będzie pracować po prostu na dostępnej treści strony, ale czasem jego działania mogą sprawić, że strona coś tam sobie wykona w oparciu o własne skrypty i trzeba dać jej na to czas przed wykonaniem kolejnych operacji.

0

@Freja Draco: to dlaczego nie wykorzystasz choćby standardowego setTimeout ?

0
kult napisał(a):

@Freja Draco: to dlaczego nie wykorzystasz choćby standardowego setTimeout ?

W sumie, ostatecznie użyłam go, chociaż w trochę pokrętny sposób.

Natomiast zwykłe setTimeout użyte wewnątrz pętli względem jakiegoś polecenia, odwlecze mi je o zadany czas, po czym bez zwłoki wykona całą resztę pętli. A chodzi mi o to, żeby wszystko szło po kolei chociaż z przerwami w niektórych punktach.

0

@Freja Draco: To zrób to z promisami

const worker = ((amount, acu = 1) => {
  document.getElementById("dane").innerHTML += `${acu} `;
  
  acu++;
  if (acu !== amount) {
    wait(acu).then(() => worker(amount, acu));
  }
});

const wait = (value => {
  if (value !== 5) {
    return Promise.resolve();
  }
  return new Promise(resolve => {
    setTimeout(() => resolve(), 3000);
  });
});

worker(10);
0

@kult: Dziękuję za sugestie.
Jak będę mieć trochę wolnego, to spróbuję obcykać te async/await i promises, bo przyznam, że na razie nie ogarniam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1