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

Problem sa setTimeout() u klasi

[es] :: Javascript i AJAX :: Problem sa setTimeout() u klasi

[ Pregleda: 2570 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zgas

Član broj: 74613
Poruke: 334
212.200.180.*

Sajt: odbrojavanje.com


Profil

icon Problem sa setTimeout() u klasi04.02.2009. u 21:55 - pre 184 meseci
Imam funkciju (klasu) ovako fomiranu:

Code:
1.function F()
2.{
3.    this.promenljiva = 1;
4.
5.    this.metod = function() {
6.        setTimeout( 'alert(this.promenljiva)', 1000);
7.    }
8.}


ako iniciram klasu: klasa = new F();
i pozovem metod: klasa.metod();
NISTA se ne desava!

Sve je u redu i klasa radi ako promenim kod u 6. liniji, tj. promenim 'this' u 'klasa':
Code:
1.function F()
2.{
3.    this.promenljiva = 1;
4.
5.    this.metod = function() {
6.        setTimeout( 'alert(klasa.promenljiva)', 1000);
7.    }
8.}

ali ovako promenjen kod klase je neupotrebljiv ako se klasa inicira pod drugim nazivom od 'klasa'.

POMOC!

[Ovu poruku je menjao zgas dana 04.02.2009. u 23:14 GMT+1]
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Problem sa setTimeout() u klasi05.02.2009. u 16:22 - pre 184 meseci
Probaj ovako :

Code:

function F()
{
    this.promenljiva = 1;

   this.metod = function() {
        setTimeout( 'alert('+this.promenljiva+')', 5000);
    }
}

klasa = new F();
klasa.metod();



vrati samo timeout kako tebi odgovara
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.rs.

Sajt: odbrojavanje.com


Profil

icon Re: Problem sa setTimeout() u klasi06.02.2009. u 14:20 - pre 184 meseci
Jedini problem je sto se pojavila neophodna stvar da pozivam sa "setTimeout" ne promenljivu, vec metod!

Ako napisem ovaj kod:


Code:
function F()
{
    this.promenljiva = 1;

    this.metod = function() {
        setTimeout( this.metod2, 5000);
    }

    this.metod2 = function() {
        ...
    }
}

klasa = new F();
klasa.metod();

Metod2 biva odmah pozvan bez odlaganja.

A ako napisem ovaj kod:
Code:
function F()
{
    this.promenljiva = 1;

    this.metod = function() {
        setTimeout( 'this.metod2', 5000);
    }

    this.metod2 = function() {
        ...
    }
}

klasa = new F();
klasa.metod();

Metod2 se nikako ne poziva!

Meni jedino izgleda da bi bilo dobro ako bi unutar klase neki kod mogao da odredi,
koji je naziv inicirane klase, pa da 'setTimeout' pozove ne setTimeout( 'this.metod2', 5000);
vec setTimeout( 'klasa.metod2', 5000);

Pomozite ako mozete!
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Problem sa setTimeout() u klasi06.02.2009. u 15:09 - pre 184 meseci
Ovaj kod radi to sto si hteo, sad sam ga isprobao :

Code:

function F()
{
    this.promenljiva = 1;

    this.metod = function() {
        setTimeout( this.metod2, 5000);
    }

    this.metod2 = function() {
        alert("Pozvan metod2 !");
    }
}

klasa = new F();
klasa.metod();


Posle 5 sekundi izbaci alert sa datim tekstom- "Pozvan metoda2". Nemoguce da isti kod radi kod mene, a kod tebe ne, uradi refresh stranice,
meni se desavalo ranije da radim u dreamweaveru i promenim nesto u .js fajlu, pokrenem i ono nista. E sad nisam ulazio u to da li je do
dreamweavera ili do browsera, ali refresh stranice je pomogao. Inace to mi se desavalo samo sa cuvenim IE6 , a sa IE7 ne, tako da je verovatno bilo do browsera.
No, ne mora da znaci da je i kod tebe ista prica, ali ipak uradi jedan refresh da iskljucis tu mogucnost, jer je kod u redu...

 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.rs.

Sajt: odbrojavanje.com


Profil

icon Re: Problem sa setTimeout() u klasi06.02.2009. u 16:45 - pre 184 meseci
Ne znam sta se desilo, ali i kod mene to sada radi.
Medjuim, kada je proradilo, shvatio sam da to moram da prosirim malo da bi aplikacija radila.
Naime, u pitanju je ajax zahtev serveru. Ako dodje do prevelikog cekanja
odgovora servera, ovaj metod sa 'setTimeout' treba da pozove metod2 koji ce:

1. prikazati poruku na ekranu da se odgovor servera predugo ceka i
2. prekinuti ajaxRequest da se dalje ne izvrsava.

Kod je sledeci:
Code:
function F()
{
    this.ajaxRequest = ...;

    this.metod = function() {
        setTimeout( this.metod2, 5000);
    }

    this.metod2 = function() {
        alert("Server ne odgovara vise od 5 sekundi.");
        this.ajaxRequest.abort();
    }
}

klasa = new F();
klasa.metod();

Medjutim, kada prodje 5 sekundi ispise se poruka o gresci, ali
se ne blokira ajax request. Ako zelite da isprobate kod sebe, probajte u ovom obliku
(sustina je ista):
Code:
function F()
{
    this.promenljiva = 1;

    this.metod = function() {
        setTimeout( this.metod2, 5000);
    }

    this.metod2 = function() {
        alert("Server ne odgovara vise od 5 sekundi.");
        alert(this.promenljiva);
    }
}

klasa = new F();
klasa.metod();

Oba alerta su se pojavila, somo sto drugi alert ne prepozna this.promenljiva.
Isto je u predhodnom kodu - nece se prepoznati this.ajaxRequest.abort();

Molim za pomoc jos jednom!

[Ovu poruku je menjao zgas dana 06.02.2009. u 18:13 GMT+1]
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
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() u klasi06.02.2009. u 17:38 - pre 184 meseci
problem ti je sto se prilikom dodeljivanja callback fje setTimout fji:
Code:

setTimeout( this.metod2, 5000);

gubi kontekst method2 funkcije, tj kada ta funkcija kasnije bude pozvana od strane setTimeout-a this unutar method2 funkcije ce biti vezano za window objekat a ne objekat tvoje "klase".

evo ti quick solution, dodaj ovo na pocetak tvog skripta:
Code:

Function.prototype.bind = function(context){

   var $this = context, fn = this;

   return function(){

         return fn.apply($this, arguments);
   }
};

i onda ovako vezuj callback:
Code:

setTimeout( this.metod2.bind(this), 5000);


to bi trebalo da je to...
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.rs.

Sajt: odbrojavanje.com


Profil

icon Re: Problem sa setTimeout() u klasi06.02.2009. u 18:29 - pre 184 meseci
Mnogo hvala Aleksandre, cuo sam negde za BIND resenje ali nisam znao kako se primenjuje.
Pa ako mozete da mi pojasnite kako primenjujem ovu 'bind' funkciju.

Da li je pomocu "prototype" primenjujem na iniciran objekat
ili na samu klasu pre nego sto iniciram objekat (ako tu uopste ima razlike)?
Odgovaralo bi mi da primenjujem na klasu, a ne da pri svakoj inicijalizaciji objekta ponavljam ovaj korak.

I da li argumentu "context" mora uvek da se dodeli "this"?
Nije mi jasno sta upisujem mesto "Function" u "Function.prototype.bind" definiciji?

[Ovu poruku je menjao zgas dana 06.02.2009. u 22:09 GMT+1]
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
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() u klasi07.02.2009. u 00:16 - pre 184 meseci
Nista ne upisujes umesto Function, to je built-in klasa i sve funkcije su instance te klase (ovo moze da zbuni pocetnike ali lepota javascripta je u tome sto je sve objekat, pa i funkcija)
znaci nista ne treba da menjas, samo prekopiraj tu bind fju na pocetak js fajla i onda kad prosledjujes fju kao argument (kao u slucaju sa setTimeout) onda samo nadovezi .bind(object) i to je to.
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.rs.

Sajt: odbrojavanje.com


Profil

icon Re: Problem sa setTimeout() u klasi07.02.2009. u 11:12 - pre 184 meseci
Svaka cast Aleksandre! Kod radi, mada mi princip nije najasniji, ali sam ga primenio kako si mi rekao.

Jedino sto me interesuje: Da li funkcija BIND povecava upotrebu memorije tako sto ponovo kopira ceo this objekat?
I da li se momorija sve vise (rapidno) povecava ako ovu funkciju pozivam vise puta sa istim dugmetom u html stranici?
Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
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() u klasi07.02.2009. u 11:42 - pre 184 meseci
Ne treba memorija da te brine uopste, druga stvar zbog koje volim javascript je sto je sve referenca (prva je da je sve objekat), naravno osim literal vrednosti.
Tako da ti ne kopiras objekat vec samo kreiras dodatnu referencu na njega, sto je po pitanju memorije neznatno povecanje...
 
Odgovor na temu

zgas

Član broj: 74613
Poruke: 334
*.ptt.rs.

Sajt: odbrojavanje.com


Profil

icon Re: Problem sa setTimeout() u klasi07.02.2009. u 14:51 - pre 184 meseci
Bas mi je drago sto je tako.

Medjutim, (mozda izlazim malo iz teme) malcice sam testirao Ajax kod koji primenjuje BIND.
Koristio sam u firefoxu "LeakMonitor" Ekstenziju. Kod radi, ali ova ekstenzija generise neka upozorenja vezana za tzv. "Leak".
Ja i ne znam na sta se odnosi ovaj "Leak" (valjda na memoriju i nekakve pukotine u memoriji).
Takodje ne znam da li se ova upozorenja odnose na kod sa BIND funkcijom ili bez nje (nisam testirao).
Sto je jos cudnije, ekstenzija izbacuje prozor za upozorenje o "LEAK-u" ali bez ikakvih informacija!

Da li mozda moze neko da mi pomogne u vezi sa ovom LEAK-om, sta je to, i na cega bi se on mogao odnositi?

Unapred vam hvala!

Aukcije, www.Odbrojavanje.com
Aukcija može biti osvojena jeftino - za 30 sekundi a 6 dinara!
 
Odgovor na temu

[es] :: Javascript i AJAX :: Problem sa setTimeout() u klasi

[ Pregleda: 2570 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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