Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa setTimeout i for petljom

[es] :: Javascript i AJAX :: problem sa setTimeout i for petljom

[ Pregleda: 1811 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

midgard
Beograd, Vozdovac

Član broj: 59016
Poruke: 127
*.routotelecom.com.



+1 Profil

icon problem sa setTimeout i for petljom18.03.2009. u 14:44 - pre 183 meseci
Imam formu u kojoj se nalazi 200 redova i u svakom redu po jedan checkbox i imam javascript koji ide po formi i radi neko poredjenje i setira ili ne setira checkbox. To je sve ok i to sve radi, ali problem je vreme koje mu treba da odradi sve to, a to vreme je nakad i po 5 minuta. Za tih 5 minuta korisniku se blokira browser totalno i nema nikakvu informaciju sta se desava sve dok posle tih ~5 minuta se od jednom ne stikliraju svi checkboxovi. Plan je bio da napravim progress bar koji bi korisnika obavestavao dokle je stigao script. Progress bar sam nasao na netu, implementirao i on takodje radi, ali pokaze rezultat tek posle ~5 minuta. Pokusao sam da ubacio setTimeout() u for petlju da nekako usporim rad, odblokiram browser i da progress bar moze da pokaze dokle je stigao, ali izgleda kao da for petlju ne zanima uopste setTimeout().

Samo da napomenem da nemam sintaksnih ni semantickih gresaka, jednostavno samo zelim da stopiram skriptu na nekoliko stotina milisekundi.

Sta da radim?
Kod je ispod, hvala unapred.

Code:

function doDelay(){
...
kod za ispis progress bara
...
}

function doWork(){
...
    for(i=1;i<=broj_ap;i++){
    ...
        setTimeout('doDelay()',500);
    ...
    }
...
}
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: problem sa setTimeout i for petljom18.03.2009. u 18:38 - pre 183 meseci
nemam bas neku ideju sta bi mogao da radis u toj petlji pa da ti toliko vremena treba za izvrsavanje (najverovatnije neka mnogo duboka rekurzija), ali me to bas i ne interesuje :) ono sto mene interesuje je zasto uopste koristis setTimeout?

zar ne bi mogao jednostavno direktno da pozoves doDelay iz petlje?
Code:

for (var i = 1; i <= total; i++) {
    ...
    doDelay(i / total);
}


tako ce ti se doDelay pozivati na kraju svake iteracije i samim tim progres bar ce biti precizniji. ne znam kako si ti uradio doDelay fju ali ja bih joj prosledio informaciju koliki je procenat procesa zavrsen (kao sto sam i uradio u ovom primeru) a ta fja bi samo bila zaduzena da prikaze tu prosledjenu vrednost (koja je uvek izmedju 0 i 1) u obliku progress bara (zapravo ja ne bih uopste koristio fju vec bi to radio direktno iz petlje, al to je ne bitno)...
 
Odgovor na temu

midgard
Beograd, Vozdovac

Član broj: 59016
Poruke: 127
*.ADSL.neobee.net.



+1 Profil

icon Re: problem sa setTimeout i for petljom18.03.2009. u 21:10 - pre 183 meseci
Prvobitno je obrada bila u for petlji, mada nije donosilo nikakve rezultate, pa sam ja onda poceo da koristim funkcije (jednu, dve, tri...), probao sam i sa setTimeout() i setInterval(), ali nista od toga nije pomoglo. Problem je u tome sto se IE totalno blokira dok ne odradi sve checkboxove, ne prihvata nikakvu komandu. U medjuvremenu probao sam Firefox, Chrome i Operu i u sva 3 izvrsi sve za max 3 sekunde, dok za IE treba 5 minuta. Ima oko 600 redova. Sto znaci da je samo IE problem, a po statistici njega u svetu vecina koristi. Plasim se da probam u IE 6 :) Znaci sada je problem kako optimizovati kod da IE moze to da proguta kao ostali browseri.

Ono sto for petlja radi to je prihvatanje 2 cene iz hidden polja, parsovanje u numeric, poredjenje i ako je uslov zadovoljavajuci setira checkbox, a ako nije oboji celiju u roze. I tako za svih 600 redova.

Poz
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: problem sa setTimeout i for petljom18.03.2009. u 23:07 - pre 183 meseci
to sto si opisao nije nesto sto moze da se izvrsava duze od 1 minuta i za 1000 "redova" (btw na sta mislis pod redom u formi?) cak i u internet exploreru, naravno ako je napisano kako treba.

daj kod koji koristis (pretpostavljam da ce biti dovoljan sadrzaj petlje, ali sto vise koda to kompletnija slika) da vidimo sta radis pogresno.
 
Odgovor na temu

midgard
Beograd, Vozdovac

Član broj: 59016
Poruke: 127
*.routotelecom.com.



+1 Profil

icon Re: problem sa setTimeout i for petljom20.03.2009. u 12:28 - pre 183 meseci
Code:

doNizPrices();
doNizProviders();
doNizProvidersPrice();

Ove funkcije generise php i one vrecaju multidimenzionalni niz svaka po jedan. Sa time sam malo ubrzao stvari, jer bolje je kad juri vrednosti po javascript nizu nego kad ih hvata iz forme sa getElementById()

Na red u formi mislim na red u tabeli <tr>, sa 7 <td>

Ovaj kod odradi se u Firefox, Operi i Chromu za 2-4 sekunde, samo je IE problem i skoro ga isto vremenski odradjuje i u IE6 i IE7, dok u IE8 RC1 radi za oko 30 sekudi manje.

Code:
 
function blabla(){
        var prices=doNizPrices();
        var prov=doNizProviders();
        var provprice=doNizProvidersPrice();
        var allAlterPrice = document.snimiAllOptions.elements;
        var broj_ap=document.getElementById('ukupno').value;
        var allProvidersSelId=document.getElementById('allprovidersallowed').selectedIndex;
        var allProvidersSel=document.getElementById('allprovidersallowed')[allProvidersSelId].value;

        for(i=1;i<=broj_ap;i++){
                var providerId=document.getElementById('uid_dest_provider_'+i).selectedIndex;
                var provider=prov[i][providerId];
                var providerPriceId=document.getElementById('uid_dest_uprice_'+i).selectedIndex;
                var providerPrice=provprice[i][providerPriceId];
                var urgPrice=Number(parseFloat(document.getElementById('uid_dest_urgentPrice_'+i).value,10).toFixed(4));
                var altPrice=prices[i][0];
                if(altPrice < urgPrice){
                        document.getElementById('linija_'+i).bgColor = '#ffffff';
                        document.getElementById('altPrice_celija_'+i).bgColor='#ffbebe';
                        document.getElementById('selectedPrice1_'+i).disabled=true;
                        document.getElementById('selectedPrice1_'+i).checked=false;
                        document.getElementById('staRadim_'+i).disabled=true;
                }
                else{
                        document.getElementById('altPrice_celija_'+i).bgColor='#e2f1ff';
                        document.getElementById('curPrice_celija_'+i).bgColor='#e2f1ff';
                        document.getElementById('cust_celija_'+i).bgColor='#e2f1ff';
                        document.getElementById('pcPrice_celija_'+i).bgColor='#e2f1ff';
                        document.getElementById('linija_'+i).bgColor = '#e2f1ff';
                        document.getElementById('selectedPrice1_'+i).checked=true;
                        document.getElementById('staRadim_'+i).checked=true;
                        document.getElementById('staRadim_'+i).disabled=false;
                }
       }
}
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: problem sa setTimeout i for petljom20.03.2009. u 19:02 - pre 183 meseci
skriptu ti usporava ogroman broj poziva getElementById fji. moja preporuka ti je da sve te id-eve zamenis sa klasama i da koristis neku bilbioteku tipa jQuery da pre petlje "dovuces" sve elemente sa odredjenom klasom u jedan js niz i onda kada iteriras kroz petlju koristis taj niz (u kom ti se vec nalaze elementi) umesto da u svakoj iteraciji setas kroz DOM (jer IE to i radi sa getElementById, krene od roota dom-a i uporedjuje svaki element da li ima taj id, ostali browseri to rade na pametniji i standardizovani nacin - imaju hash tabelu sa referencama na elemente pa je getElementById veoma brz)
 
Odgovor na temu

[es] :: Javascript i AJAX :: problem sa setTimeout i for petljom

[ Pregleda: 1811 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.