• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla w javascript.

VPS Starter Arubacloud
+1 głos
834 wizyt
pytanie zadane 17 lutego 2017 w JavaScript przez lukaszlukasz Nowicjusz (170 p.)

Witam. Napisałem taki kod, który niestety wygląda jakby wpadał w nieskończoną pętle lub coś w tym stylu, gdyż program zamiast co sekundę odliczać od podanej wartości do 0 to działa tak, że po sekundzie pokazuje się na ekranie 0 ;) .

Ma ktoś pomysł w czym może tkwić błąd? 

function pobieranie()
{
    var podana_wartosc;
    podana_wartosc = document.getElementById("pole").value;
   
    licznik=podana_wartosc;
    for( var i=0; i<licznik;i++)
        {
            setTimeout(function(){document.getElementById("wyswietlacz").innerHTML = podana_wartosc;}, 1000);
            podana_wartosc=podana_wartosc-1;
        }
}

Przestawiam się z cpp na js, na razie idzie ciężko ;) 

2 odpowiedzi

0 głosów
odpowiedź 17 lutego 2017 przez Ehlert Ekspert (212,630 p.)

Ja dla pewności licznik potraktowałbym parseInt. A tak na przyszłość:

  1. Klikamy F12 (albo zbadaj element)
  2. Zakładka Sources, po polsku chyba Źródło?
  3. Otwieramy z panelu po lewej plik JS.
  4. Klikamy numer linijki gdzie mamy się zatrzymać.
  5. Wywołujemy skrypt (przeładowanie strony/kliknięcie button itp)
  6. Po kodzie poruszamy się przyciskami Step intoStep overStep out
  7. Dodatkowo mamy okienko Watch gdzie jak klikniemy Add expression to możemy obserwować wartości zmiennych wink

Słowem Debugowanie.

komentarz 17 lutego 2017 przez Ehlert Ekspert (212,630 p.)

Licznik został zadeklarowany bez var. Chyba, że to coś publicznego.

komentarz 17 lutego 2017 przez Ehlert Ekspert (212,630 p.)

Nie chcę Ci mówić gdzie masz błąd, ale to że umieściłeś setTimeout w forze nie znaczy że jedna iteracja trwa 1000ms cheeky cała pętla wykonuje się w mniej niż sekundę prawdopodobnie. 

komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
Dzięki za odpowiedź. tzn, używałem już debugera w chromie (nie do końca jeszcze ogarniam wszystkie funkcje), ale nic nie udało mi się wykryć ;)

Tak, brakuje tam var, niestety nie zmienia to działania programu.
komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
Taki podjąłem trop, że to coś z tą setTimeout, jednak z jej specyfikacji wynika, że zadana funckja wykona się po podanym czasie, więc nie rozumiem dlaczego wykonuje się szybciej :o
komentarz 17 lutego 2017 przez Ehlert Ekspert (212,630 p.)
For nie będzie czekać na Twojego setTimeouta.
komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
W tym rzecz, problem zdiagnozowany,teraz tylko potrzeba nowego rozwiązania problemu :)
komentarz 17 lutego 2017 przez Ehlert Ekspert (212,630 p.)

Poczytaj o rekurencji i tam wywołaj setTimeout cheeky

komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
chodzi o funkcje rekurencyjny, by wywoływały się nawzajem, i wtedy pierwsza funkcja będzie czekała z wykonaniem drugiej na tego setTimeouta, a nie tak jak for ;) ? Dobrze rozumiem?
komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
Dobra, nie zawracam głowy, posprawdzam ;) Dzieki za odpowiedzi
0 głosów
odpowiedź 17 lutego 2017 przez obl Maniak (51,280 p.)

Zobacz co się dzieje, najpierw robisz tą pętlę, której wykonanie trwa ułamek sekundy, w tym czasie uruchamiasz zegar, żeby po sekundzie ci uruchomił jakąś tam funkcję która wyświetli zmienną podana_wartosc. Ale twoja pętla w tym czasie odliczy już do 0 i ustawi wartość zmiennej podana_wartość na 0 i dlatego od pierwszego wywołania funkcji nic się nie dzieje.

Poza tym parseInt jak napisał @Ehlert bo pod tym polem formularza może być tekst. Później jeszcze trzeba sprawdzić czy nie zwróciło NaN (bo to zwraca, gdy podana wartość nie jest liczbą).

komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
Dzięki! Wychodziłem z założenia, że kolejna iteracja następuje dopiero po wykonaniu się tego odstępu czasowego. Teraz pozostaje mi tylko wymyślić, jak zrobić to w inny sposób, jakieś wskazówki mile widziane :)

Dzięki za uwagi o NaN
komentarz 17 lutego 2017 przez obl Maniak (51,280 p.)
edycja 17 lutego 2017 przez obl

Spróbuj tak (mniej więcej powinno działać):

var podana_wartosc = 0;

function timer(){ document.getElementById("wyswietlacz").innerHTML = podana_wartosc; podana_wartosc=podana_wartosc-1;
setTimeout(timer, 1000);
}

function pobieranie(){
    podana_wartosc = parseInt(document.getElementById("pole").value);
    if(podana_wartosc !== NaN){
    timer();
    }
}

Zapomniałem o wywołaniu timera w funkcji :)

komentarz 17 lutego 2017 przez lukaszlukasz Nowicjusz (170 p.)
super działa, dzięki.

Podobne pytania

0 głosów
2 odpowiedzi 631 wizyt
pytanie zadane 18 sierpnia 2021 w JavaScript przez adek236 Nowicjusz (180 p.)
+1 głos
3 odpowiedzi 513 wizyt
pytanie zadane 26 kwietnia 2021 w JavaScript przez molik Użytkownik (950 p.)
+1 głos
3 odpowiedzi 1,100 wizyt
pytanie zadane 18 stycznia 2018 w JavaScript przez Artek Stary wyjadacz (11,800 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...