• 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
104 wizyt
pytanie zadane 17 lutego 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ź 17 lutego przez użytkownika Ehlert Szeryf (75,530 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 17 lutego przez użytkownika Ehlert Szeryf (75,530 punkty)

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

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

Poczytaj o rekurencji i tam wywołaj setTimeout cheeky

komentarz 17 lutego 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 17 lutego przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
Dobra, nie zawracam głowy, posprawdzam ;) Dzieki za odpowiedzi
0 głosów
odpowiedź 17 lutego przez użytkownika obl Pasjonat (19,880 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 17 lutego 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 17 lutego przez użytkownika obl Pasjonat (19,880 punkty)
edycja 17 lutego 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 17 lutego przez użytkownika lukaszlukasz Nowicjusz (130 punkty)
super działa, dzięki.

Podobne pytania

0 głosów
1 odpowiedź 79 wizyt
pytanie zadane 17 stycznia w JavaScript, jQuery, AJAX przez użytkownika mowmiheniek Stary wyjadacz (10,940 punkty)
0 głosów
2 odpowiedzi 129 wizyt
pytanie zadane 12 lutego w JavaScript, jQuery, AJAX przez użytkownika Trzebu Obywatel (1,050 punkty)
0 głosów
0 odpowiedzi 33 wizyt
pytanie zadane 12 grudnia 2015 w JavaScript, jQuery, AJAX przez użytkownika xR Mądrala (6,360 punkty)
...