Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript] undefinied zamiast wartosci - zasieg ?
Octobus
post 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
  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 ...
Go to the top of the page
+Quote Post
Comandeer
post 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


--------------------
Go to the top of the page
+Quote Post
session
post 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
Go to the top of the page
+Quote Post
Xelah
post 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%)
-----


Kod
setTimeout(function(tablica, i) {}, i*2000, tablica, i);


https://jsfiddle.net/ex5fp5uw/
Go to the top of the page
+Quote Post
session
post 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().
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 17:38