Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] undefinied zamiast wartosci - zasieg ?
Forum PHP.pl > Forum > Przedszkole
Octobus
mam w buttonie na stronie
  1. OnClick="dod_wiele('157774, 157745, 157714, 157639, 157617, 157584, 157567, 157565, 157563, 157528, 157481, 157420, 157405, 157387, 157235');


w javascript wyglada to tak:
[JAVASCRIPT] pobierz, plaintext
  1. function dod_wiele(tablica_)
  2. {
  3. tablica = tablica_.split(',');
  4.  
  5. console.log(tablica);
  6. console.log('length: '+tablica.length);
  7.  
  8. for(i=0; i < tablica.length; i++){
  9.  
  10. setTimeout(function() {
  11. console.log('test 3, id: '+tablica[i]+', product_id: '+jQuery('#produkt_id_'+tablica[i]).val()+', ilosc: '+jQuery('#a_ilosc_'+tablica[i]).val());
  12. }, i*2000);
  13. }
  14. }
[JAVASCRIPT] pobierz, plaintext


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 ...
Comandeer
JS trzyma scope, więc trzeba mu powiedzieć, żeby tego nie robił → http://www.forumweb.pl/javascript/addevent...y/495181#495181
session
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);
}
Xelah
Kod
setTimeout(function(tablica, i) {}, i*2000, tablica, i);


https://jsfiddle.net/ex5fp5uw/
session
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().
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.