wait w pętli synchronicznie wykonywanych poleceń

wait w pętli synchronicznie wykonywanych poleceń
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

Kurszwrrr...

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

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

edytowany 3x, ostatnio: Freja Draco
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

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

Kopiuj
<!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?


Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

Odchudzona i doludziona wersja:

Kopiuj
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ę.


edytowany 1x, ostatnio: Freja Draco
Stefan_3N
  • Rejestracja:około 6 lat
  • Ostatnio:około miesiąc
  • Postów:145
0

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


Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 7 godzin
1

Thread.sleepa w JavaScripcie nie ma.

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
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.


edytowany 1x, ostatnio: Freja Draco
kult
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad rok
0

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

Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
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.


kult
  • Rejestracja:prawie 22 lata
  • Ostatnio:ponad rok
0

@Freja Draco: To zrób to z promisami

Kopiuj
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);
Freja Draco
Freja Draco
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
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.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.