wait w pętli synchronicznie wykonywanych poleceń

Odpowiedz Nowy wątek
2019-03-13 14:43
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
}

edytowany 3x, ostatnio: Freja Draco, 2019-03-13 14:44

Pozostało 580 znaków

2019-03-13 15:07
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?


Pozostało 580 znaków

2019-03-13 15:22
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ę.


edytowany 1x, ostatnio: Freja Draco, 2019-03-13 15:36

Pozostało 580 znaków

2019-03-13 15:35
0

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


Pozostało 580 znaków

2019-03-13 15:37
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.

Pozostało 580 znaków

2019-03-13 15:41
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, 2019-03-13 15:59

Pozostało 580 znaków

2019-03-13 16:46
0

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

Pozostało 580 znaków

2019-03-13 17:08
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.


Pozostało 580 znaków

2019-03-13 19:57
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);

Pozostało 580 znaków

2019-03-13 22:12
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.


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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