Avatar billede the_saint Nybegynder
17. januar 2007 - 21:57 Der er 6 kommentarer og
1 løsning

setTimeout inde i classe

Jeg har oprettet en klasse med følgende metode:

   
    this.startPing = function()
    {
        if(this.isFlying == false) this.ping();
        setTimeout("this.startPing", 1000);
    }

Jeg kan fint kalde metoden, men den vil ikke kalde sig selv igen :(

Hvad gør jeg forkerT?
Avatar billede crazysnap Seniormester
18. januar 2007 - 09:43 #1
Hej the saint,


Du mangler bare lige et par parenteser på din set-timeout streng. :)

Så hvis du udskifter:

setTimeout("this.startPing", 1000);

med:

setTimeout("this.startPing()", 1000);


Burde det virke fint :).



Mvh.

- Snap
Avatar billede the_saint Nybegynder
18. januar 2007 - 09:46 #2
Det har jeg prøvet, og det er samme problem :\ Jeg har løst det ved at lave en funktion uden for classen som kalder sig selv og metoden gentagne gange.. men jeg tester lige igen nu her om lidt :)
Avatar billede crazysnap Seniormester
18. januar 2007 - 09:47 #3
Ok mærkeligt, det her test script virker ihvertfald fint! :)


<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>lukke parent demo</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <script type="text/JavaScript">
        var isFlying = false;
       
        this.ping = function()
        {
            alert("ping");
        }
       
        this.startPing = function()
        {
            alert("Hej");
            if(this.isFlying == false)
                this.ping();

            setTimeout("this.startPing()", 1000);
        }

        </script>
    </head>
    <body onload="java script:startPing();">
       
    </body>
</html>


Kan være du kan spotte en fejl i dit script ud fra mit her. :)


Mvh.

- Snap
Avatar billede olebole Juniormester
18. januar 2007 - 14:50 #4
<ole>

crazysnap >> Ja, men der er nu også en decideret fejl i dit script (det er forkert at bruge JavaScript pseudo-protokollen i en event-handler) - og så omhandler dit eksempel noget helt andet end det, der spørges om  =)

the_saint >> Du skal oprette en variabel i metoden, der refererer til objekt-instansen - og bruge den i din timeout ... f.eks:

    this.startPing = function()
    {
        var me = this;
        if(this.isFlying == false) this.ping();
        setTimeout(function(){me.startPing()}, 1000);
    }

/mvh
</bole>
Avatar billede the_saint Nybegynder
18. januar 2007 - 15:54 #5
Olebole, det prøver jeg :)

Er lige små irriteret efter at have debugget på samme fejl siden igår kl 22, og så finder ud af at fejlen skyldes det program (Firebug) jeg bruger til at debugge js med ... ironisk nok...
Avatar billede the_saint Nybegynder
18. januar 2007 - 16:07 #6
Ole, din viden om javascript bliver ikke engang overgået af de forskellige Javascript parsers der findes! det er utroligt.. smid et svar =)
Avatar billede olebole Juniormester
19. januar 2007 - 14:36 #7
Hehe - tusind tak. Til div. parser'es og debugger'es undskyldning skal nu siges, at den 'fejl', du begik, ikke er en egentlig fejl  =)

Sagen er bare, at ordet 'this' (i dit oprindelige eksempel) ikke refererer til den aktuelle instans af objektet, når 'this' bruges i en callback-funktion - eller en timeout.
Det er ikke syntaktisk forkert at bruge 'this' i den givne situation ... resultatet bliver blot ikke det ventede.

Jeg har skrevet rigtig meget objektorienteret JS-kode og så får man automatisk en masse erfaring i den slags forhold - så det er på en lidt billig baggrund at optræde som værende dramatisk bedre end de forskellige debuggers  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester