[JavaScript] undefinied zamiast wartosci - zasieg ? |
[JavaScript] undefinied zamiast wartosci - zasieg ? |
25.05.2015, 14:31:02
Post
#1
|
|
Grupa: Zarejestrowani Postów: 259 Pomógł: 1 Dołączył: 3.07.2011 Ostrzeżenie: (0%) |
mam w buttonie na stronie
w javascript wyglada to tak:
i w setTimeout nie przekazuje mi zmiennych. Dokładnie to co wywala przegladarka: Cytat ["157774", "157745", "157714", "157639", "157617", "157584", "157567", "157565", "157563", "157528", "157481", "157420", "157405", "157387", "157235"] produkt.js:645 length: 15 (15 razy) test 3, id: undefined, product_id: undefined, ilosc: undefined musze miec setTimeout bo wykonuje 15 razy okreslony kod z roznymi zmiennymi po ktorym wykonaniu musi byc chociaz chwila przerwy. Tylko czemu jest undefinied ? Zasieg zmiennych ? Juz poltorej godziny sie mecze z roznymi rozwiazaniami i nic ... |
|
|
25.05.2015, 19:21:18
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 268 Pomógł: 254 Dołączył: 11.06.2009 Skąd: Świętochłowice Ostrzeżenie: (0%) |
JS trzyma scope, więc trzeba mu powiedzieć, żeby tego nie robił → http://www.forumweb.pl/javascript/addevent...y/495181#495181
-------------------- ★Mój blog || Okiem krytyka★
|
|
|
25.05.2015, 19:24:44
Post
#3
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) |
Ja myślę, że problem jest głównie ze zmienną i. Ponieważ setTimeout wykona callback (podaną funkcję) po upłynięciu czasu, a wtedy zmienna i będzie miała wielkość równą ilości elementów w tablicy. Dojdzie do próby wstawienia w tym przypadku tablica[15], a taki element tej tablicy nie istnieje (dlatego undefined). Ogólnie setTimeout zapisuje w pamięci jaką funkcję ma wykonać po upływie określonego czasu wstawiając po tym czasie lokalne zmienne w odpowiednie miejscie. W dodatku ten for owszem wykona się dokładnie tyle razy ile ma tablica elementów, ale w ostatnim obiegu również wykona się i++ przez co wydzie poza tablicę.
Dowód ? Kod for(i=0; i < 4; i++){ setTimeout(function() { alert(i); }, 2000); } Zatem najlepiej inkrementować zmienną wewnątrz funkcji callback. Kod i=0; setTimeout(function() { alert(i); i++; setTimeout(function(){ alert(i);}, 2000); }, 2000); Czyli typowa rekurencja. W Twoim przypadku najlepiej, abyś to co robi callback umieścił w osobnej funkcji, która będzie ustawiała kolejne timeouty. Każdy następny callback uruchomi kolejne odliczanie czasu zatem nie dajesz wtedy i*2000 tylko samo 2000, ponieważ kolejny timeout zostanie ustawiony po wykonaniu poprzedniego, czyli po 2000ms itd. itd: Kod function dod_wiele(tablica_){ tablica = tablica_.split(','); console.log(tablica); console.log('length: '+tablica.length); function showTimeout(tablica, i, l){ console.log('test 3, id: '+tablica[i]+', product_id: '+jQuery('#produkt_id_'+tablica[i]).val()+', ilosc: '+jQuery('#a_ilosc_'+tablica[i]).val()); i++; if(i < l){ setTimeout(function() { showTimeout(tablica, i, l); }, 2000); } } showTimeout(tablica, 0, tablica.length); } Ten post edytował session 25.05.2015, 19:49:23 |
|
|
25.05.2015, 19:32:31
Post
#4
|
|
Grupa: Zarejestrowani Postów: 139 Pomógł: 24 Dołączył: 12.05.2013 Skąd: Hamburg Ostrzeżenie: (0%) |
|
|
|
25.05.2015, 20:15:34
Post
#5
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) |
W dodatku zwróć uwagę na
Kod ('#produkt_id_'+tablica[i]) jeśli podasz tablicę w takiej postaci: Kod '157774, 157745, 157714, 157639, 157617, 157584, 157567, 157565, 157563, 157528, 157481, 157420, 157405, 157387, 157235' prawdopodobnie tam też dostaniesz undefined ze względu na występowanie spacji, split(',') pozbędzie się jedynie ,. Zatem albo popraw dane, albo split. Możesz też przecież przekazać do funkcji od razu tablicę nie marnując niepotrzebnie czasu na działanie split().
|
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 17:38 |