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

Pętla w javascript.

+1 głos
93 wizyt
pytanie zadane 3 dni temu w JavaScript, jQuery, AJAX przez użytkownika lukaszlukasz Nowicjusz (130 punkty)

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ź 3 dni temu przez użytkownika Ehlert Maniak (73,190 punkty)

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 3 dni temu przez użytkownika Ehlert Maniak (73,190 punkty)

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

komentarz 3 dni temu przez użytkownika Ehlert Maniak (73,190 punkty)

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 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
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 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
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 3 dni temu przez użytkownika Ehlert Maniak (73,190 punkty)
For nie będzie czekać na Twojego setTimeouta.
komentarz 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
W tym rzecz, problem zdiagnozowany,teraz tylko potrzeba nowego rozwiązania problemu :)
komentarz 3 dni temu przez użytkownika Ehlert Maniak (73,190 punkty)

Poczytaj o rekurencji i tam wywołaj setTimeout cheeky

komentarz 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
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 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
Dobra, nie zawracam głowy, posprawdzam ;) Dzieki za odpowiedzi
0 głosów
odpowiedź 3 dni temu przez użytkownika obl Pasjonat (18,850 punkty)

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 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
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 3 dni temu przez użytkownika obl Pasjonat (18,850 punkty)
edycja 3 dni temu przez użytkownika 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 3 dni temu przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
super działa, dzięki.

Podobne pytania

0 głosów
1 odpowiedź 68 wizyt
pytanie zadane 17 stycznia w JavaScript, jQuery, AJAX przez użytkownika mowmiheniek Stary wyjadacz (10,830 punkty)
0 głosów
2 odpowiedzi 114 wizyt
pytanie zadane 12 lutego w JavaScript, jQuery, AJAX przez użytkownika Trzebu Użytkownik (780 punkty)
0 głosów
0 odpowiedzi 32 wizyt
pytanie zadane 12 grudnia 2015 w JavaScript, jQuery, AJAX przez użytkownika xR Mądrala (6,360 punkty)
...