Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> clearTimeout w klasie nie przestaje wywoływać metody
starach
post
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


Napisałem sobie klasę Counter która ma służyć za prosty licznik który wykorzystam przy wywołaniach AJAX'a.
Niestety z jakiegoś niewiadomego mi powodu wewnętrzna metoda sprawdzająca nie wyłącza mi licznika. Z zewnątrz mogę to zrobić, ale z wew. klasy nie.

Kod
function Counter()
{
    this.jump = 1;
    this.meter = 0;
    this.timeout = 100;
    this.count_to = null;
    this.evt_func = null;
    this.task_pointer = null;
    var ths = this
    
    this.start = function()
    {
        this.meter += this.jump;
        if(this.evt_func !== null)
        {
            setTimeout(this.evt_func, 0);
        }
        if(this.count_to !== null && this.count_to == this.meter)
        {
            this.stop();
        }
        this.task_pointer = setTimeout(function(){ ths.start(); }, this.timeout);
    }
    this.stop = function()
    {
        $('span#test2').html(this.meter);
        clearTimeout(this.task_pointer);
    }
    this.eventRegister = function($fn)
    {
        if(!jQuery.isFunction($fn)) {
            alert('Paremeter incorrect given for Counter::eventRegister');
        } else {
            this.evt_func = $fn;
        }
    }
}

$Counter = new Counter();
$Counter.meter = 0;
$Counter.count_to = 20;
$Counter.eventRegister(function($Counter)
{
    $('span#test').html($Counter.meter);
});
$Counter.start();

$Counter.meter może nie działać bo kod przepisałem z mojej klasy obsługi wywołania AJAX która jest statyczna zmieniając function() na function($Counter) więc nie jestem pewien czy ten przykład będzie śmigać tak jak powinien. Ale u mnie $('span#test') zmienia swoją wartość co sekundę. Natomiast $('span#test2') gdy licznik dojdzie do 20. Niestety nie zatrzymuje się na nich tylko jedzie dalej do usranej śmierci... Z kolei jeśli wywołam metodę stop z zewnątrz klasy to licznik przestaje dalej lecieć. Co może być przyczyną?

p.s.
Tak przy okazji się zapytam. Wiecie może jak wywołanie 'zdarzenia licznika' setTimeout(this.evt_func, 0); zastąpić czym nie wykorzystującym setTimeout? Chodzi mi o to jak mam to w inny sposób wywołać.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Tak przy okazji się zapytam. Wiecie może jak wywołanie 'zdarzenia licznika' setTimeout(this.evt_func, 0); zastąpić czym nie wykorzystującym setTimeout? Chodzi mi o to jak mam to w inny sposób wywołać.

A zwykłe this.evt_func() nie działa?

Cytat
Niestety nie zatrzymuje się na nich tylko jedzie dalej do usranej śmierci... Z kolei jeśli wywołam metodę stop z zewnątrz klasy to licznik przestaje dalej lecieć. Co może być przyczyną?

Konsola JavaScript coś mówi?
Go to the top of the page
+Quote Post
starach
post
Post #3





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


Cytat(erix @ 6.04.2009, 17:10:37 ) *
A zwykłe this.evt_func() nie działa?
Dzięki. Oczywiście rzecz najoczywistsza i o niej nie pomyślałem.
Cytat(erix @ 6.04.2009, 17:10:37 ) *
Konsola JavaScript coś mówi?
No niestety właśnie nic. Konsola błędów firefoksa czysta, konsola firebug'a czysta. (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Masz możliwość wypuszczenia tego skryptu w działaniu? Chociaż JS ze strukturą HTML, w ciemno trochę ciężko modzić.
Go to the top of the page
+Quote Post
lord_t
post
Post #5





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


To się nie zatrzymuje ponieważ chcesz zastopować timeouta który już minął, tego poprzedniego.

Daj to:
Kod
this.task_pointer = setTimeout(function(){ ths.start(); }, this.timeout);

Przed ifa który ma stopować.

Proponowałbym przejść na setInterval() albo nie tyle stopować timeout co w ogóle go nie uruchamiać:

Coś takiego (bardziej luźna myśl jak kod z prawdziwego zdarzenia):
Kod
if(this.count_to !== null && this.count_to == this.meter)
{}
else
setTimeout(function(){ ths.start(); }, this.timeout);


Ten post edytował lord_t 6.04.2009, 18:38:44
Go to the top of the page
+Quote Post
starach
post
Post #6





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


Zaraz wypróbuje twój kod lord_t.

Reprodukcja błędu: http://www.orglee.com/testy/licznik/

Dałem "this.task_pointer = setTimeout(function(){ ths.start(); }, this.timeout);" w else i zaczęło działać.

Jak on cholera ten skrypt wykonuje?!?!

Ten post edytował orglee 6.04.2009, 18:51:35
Go to the top of the page
+Quote Post
lord_t
post
Post #7





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Rozwiń swoje pytanie;) Bo wykonuje jak zaimplementowałeś(IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




AFAIR w callbackach nie powinno się używać this.
Go to the top of the page
+Quote Post
lord_t
post
Post #9





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Ale to nie bezpośrednio this.
Go to the top of the page
+Quote Post
erix
post
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ale callback jest wywoływany anonimowo, to co jest kontekstem dla tej funkcji? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Trzeba by było podstawić jakąś instancję, to wtedy rozumiem. Ale póki co - w wywołaniu jej nie ma.

A tak BTW, ~orglee, masz literówkę; ths zamiast this.
Go to the top of the page
+Quote Post
starach
post
Post #11





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


No właśnie nie erix. To nie jest literówka. Wcześniej deklaruję var ths = this inaczej odwołanie by nie działało zmienne klasowe nie sięgają do funkcji wew. czy jak to inaczej nazwać. Natomiast tak zadeklarowana referencja do obiektu zadziała.

Chodziło mi o to dlaczego on zamiast wykonać najpierw stop() wywołuje setTimeout(). Dla mnie to jest cholera nielogiczne.
Go to the top of the page
+Quote Post
lord_t
post
Post #12





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


erix:no jest wywoływany anonimowo, ale podajesz mu gotowy obiekt-funkcję(anonimową instancję) gdzie w chwili stworzenia jest znana wartość/adres ths.

orglee, to jest logiczne: najpierw działa stop, ale w chwili kiedy działa w task_pointer jest timeout ten który się wykonał. Po tym zastopowaniu tego co się juz zrobiło wpisujesz nowy timeout do task_pointer, a tego już poprzednim stopem nie zatrzymasz.

Ten post edytował lord_t 6.04.2009, 19:22:57
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Fakt, przeoczyłem ths.
Go to the top of the page
+Quote Post
starach
post
Post #14





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

Ostrzeżenie: (0%)
-----


A ja przeoczyłem fakt że tępak ze mnie...

No oczywiście że to jest logiczne. Dziękuję bardzo pewnie gdybym sam szukał przyczyny nie znalazłbym prędko... :|

edit>
Dałem 3 razy pomógł mam nadzieję że nie przesadziłem.

Jeszcze jakbyście mi powiedzieli dlaczego należy używać setInterval zamiast setTimeout.

edit>>
Ok już znalazłem.
Cytat
What is setTimeout():

It is a function that can execute other javascript statement AFTER x interval. The interval unit is millisecond.

Syntax:

setTimeout(”do.something();”, 1000); //Execute do.something() 1 second later.

What is setInterval():

It is a function that can execute other javascript statement EVERY x interval. The interval unit is millisecond.

Syntax:

setInterval(”do.somethingElse();”, 2000); //Execute do.somethingElse() every 2 seconds.


Ten post edytował orglee 6.04.2009, 21:03:36
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 16.09.2025 - 04:38