W jaki sposób zatrzymać wykonywanie się skryptu w pętli?

W jaki sposób zatrzymać wykonywanie się skryptu w pętli?
Sunnydev
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Nether
  • Postów:235
0

Hej,
Dostałem zadanie do wykonania w którym muszę co określony czas pobierać widok z innych stron. Nie wiem jak ugryźć funkcję, która powoduje zatrzymanie się pętli. Może Wy zrozumiecie patrząc na kod:

Kopiuj
<script type="text/javascript">

//function sleep(milliseconds) {
//  var start = new Date().getTime();
//  for (var i = 0; i < 1e7; i++ ) {
//     if ((new Date().getTime() - start) > milliseconds {
//    break;
//     }
//   }
// }
function test()
{
  var x = ["adres", "adres","adres","adres"];
  var i = 0;

   do
   {
      document.getElementById("ramka").src = x[i];
      i++;
      if (i == 3)
          i=0;

          //sleep(60000);
       }while(i < 4);
}

Albo nic się nie dzieje, albo strona się crashuje.. HEELP
Ps. Sorka za burdel u góry, piszę z komórki


lubię tylko w c++ i w rust i w go i w haskell. pythona nie lubię, javy też. c# toleruję.
edytowany 1x, ostatnio: Sunnydev
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 15 godzin
  • Lokalizacja:Kraków
  • Postów:1114
0

Zamiast robić własnego sleepa użyj setTimeout albo setInterval, do wywoływania swojego kodu co określony czas:

https://www.w3schools.com/js/js_timing.asp


Sunnydev
Próbowałem z timeoutem, ale ten wykonuje się tylko raz. Interval powoduje, ze pętla się nie iteruje(?).
neves
niby czemu miała by się nie iterować? zresztą na końcu wywoływanej funkcji przez setTimeout możesz jeszcze raz wywołać setTimeout z tą samą funkcją i będziesz miał nieskończone wywołania
GU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Wroclaw
  • Postów:172
0

Napisałeś nieskończoną pętle.

Kopiuj
if (i == 3)
          i=0;

To powoduje, ze ustawiasz i na 0 za kazdym razem gdy i jest rowne 3, a w warunku kończacym petle masz żeby powtarzac dopoki i jest mniejsze od 4, a ta sytuacja występuje w nieskończoność.

Sunnydev
Bo ona ma być nieskończona, tylko po każdej inkrementacji ma skrypt usnąć
GU
A to sorry, nie doczytałem :P
GU
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Wroclaw
  • Postów:172
0

Doczytałem i wnioskuję, że chodzi Ci o coś takiego:

Kopiuj
var interval = setInterval(twojaFunkcja, coJakiCzasMaBycOdpalanaTwojaFunkcja);
setTimeout(function() {
    clearInterval(interval)
}, czasPoJakimMaPrzestacWywolywacTwojaFunkcje);
Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
0

Tak chyba najprościej:

Kopiuj
function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms))
}

async function test() {
  let i = 0
  
  while (true) {
    await delay(1000)
    
    console.log(i) // your code here
    
    i = (i + 1) % 3
  }
}

test()

CodePen: https://codepen.io/caderek/pen/bLOyMK?editors=0012

edytowany 1x, ostatnio: Maciej Cąderek

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.