Toon posts:

Functies via een timeout in het hetzelfde object aanroepen

Pagina: 1
Acties:
  • 149 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ja, het is eindelijk gelukt, om een functie in een object vanuit dat eigen object aan te roepen via een interval of timeout.

Het probleem:

Je krijgt problemen als je iets probeert om een functie vanuit een object aan te roepen via een setInterval met het this keyword.
code:
1
setInterval(this.woei, 500);


setInterval is een method van het window object, en this zal dus op het window object slaan, en niet op het object vanwaar je die setTimeout functie aanroept.

De truc:

Sla de referentie naar de aan te roepen functie op in een propertie van het window object, bijvoorbeeld zo:

code:
1
2
3
4
5
6
7
8
9
10
11
myIntervalFunctions = new Array();

function WoeiObject() {
  this.woei = function() {
    alert("Woei!");
  }
  myIntervalFunctions[0] = this.woei;
  setTimeout(myIntervalFunctions[0], 5000);
}

myObject = new WoeiObject();


Het object slaat de referentie naar de juiste functie op in een array. Een array, omdat dit vooral handig is bij het maken van timer objecten. Het zou voor een enkele timer net zo goed één variabele kunnen zijn.

Volgens mij is nu ook de laatste telg van de eval familie overbodig geworden, daar ik nu denk dat bijna alles nu volledig object-oriented te doen is.

[edit]
In mijn enthousiame ben ik vergeten om te vermelden dat oh,when? er op IRC over begon ;) Ik verwacht hem dan ook vrij spoedig met een compleet timerobject :P

[ Voor 0% gewijzigd door Verwijderd op 02-08-2002 00:56 . Reden: credits ;) ]


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 14:27

Pelle

🚴‍♂️

Tsja, en als je nooit in #devschuur komt dan zul je dit soort leuke hersenspinsels dus moeten missen :)

Ben na Cheatah ook gelijk even aan de slag gegaan, maar hetgeen wat helaas nog steeds niet gaat lukken is een functie als argument meegeven aan een timer-functie van een object. Zie onderstaande code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        // speciaal voor Cheatah de leuke var-namen behouden ;)

        timers = new Array();

        function Melp() {
            this.zuut = function() {
                alert("jaja");
            }

            this.blab = function(what) {
                alert(what);
            }   

            this.setTimeout = function(ref, interval) {
                timers[ref] = setTimeout(this.zuut, interval);
            }
        }
        
        barf = new Melp();
        barf.setTimeout("huppie", 500);


Dit werkt op de manier die Cheatah hierboven beschreven heeft. Maar, stel, ik wil de functie blab gebruiken (waar ik dus de te alerten tekst als argument meegeef):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        timers = new Array();

        function Melp() {
            this.zuut = function() {
                alert("jaja");
            }

            this.blab = function(what) {
                alert(what);
            }   

            this.setTimeout = function(ref, interval) {
                timers[ref] = setTimeout(this.blab("joehoe!"), interval);
            }
        }
        
        barf = new Melp();
        barf.setTimeout("huppie", 2000);


Hier gaat hij nu over z'n nek. De tekst wordt wel gealert, maar niet nadat de interval time verstreken is. Dat is logisch opzich, want je hebt het over functie-referenties, maar nu wil ik dus een manier om argumenten en als het kan zelfs functies aan een setTimeout mee te geven, zonder voor elke functie afzonderlijk vooraf een referentie in die global array te moeten maken.

Dit is de ideale situatie:
code:
1
2
        barf = new Melp();
        barf.setTimeout("huppie", "blab('joehoe!')", 2000);


Oftewel: voer this.blab uit, met als argument "joehoe", stop dit in de globale array onder het label "huppie" en doe dit alles na 2000 seconden.

* Pelle zegt in ieder geval: good work Cheatah :)

/edit
Ja oh,when? dit is ranzig gecode ja.. prototyping is netter.. maar ik heb sinds mijn overwerksessie van vanavond nu eindelijk vakantie, dus zin in netjes coden had ik niet meer na de hele dag al bezig te zijn geweest ;)

  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 14:27

Pelle

🚴‍♂️

oh,when? wees me -terecht- nog op iets waarmee ik voorbij ging aan Cheatah's idee; onderstaande code is al een stap verder in hetgeen ik bedoel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        timers = new Array();

        function Melp() {
            this.zuut = function() {
                alert("jaja");
            }

            this.blab = function(what) {
                alert(what);
            }   

            timers["zuut"] = this.zuut;
            timers["blab"] = this.blab;
            
            this.setTimeout = function(ref, interval) {
                setTimeout(timers[ref], interval);
            }
        }
        
        barf = new Melp();
        barf.setTimeout("zuut", 1000);
        barf.setTimeout("blab", 1000);

  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

woei..wat een hersenspinsel al niet teweeg kan brengen. Goed ik was dus ook al ff bezig en dit is wat ik tot nutoe had:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Timer = function(func, expireTime){
        (typeof(func) == \"function\") ? (this.func = func) : (new Function(func)) ;

        this.expireTime = expireTime;
        this.aReference = new Array();
}

Timer.prototype.start = function(){
        this.reference = this.aReference.length;
        this.aReference[this.reference] = new Object();
        this.aReference[this.reference].expireTime = this.expireTime;
        this.aReference[this.reference].func = this.func;

        this.aReference[this.reference].timerID = setTimeout(this.func,this.expireTime);

        return this.reference;
}

function doWrite() {
    alert(\"test\");
}

function test() {
    myTimer = new Timer(doWrite, 2000);
    test = myTimer.start();
    delete (myTimer);
}


nog ff verder uitwerken maar goed :)

"You're only as good, as what you did last week."


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:35

crisp

Devver

Pixelated

Het idee om object referenties in een globale array te stoppen is al vaker langsgekomen naar mijn idee. Voor de beruchte smilies heb ik hetzelfde gedaan.
Bijkomend voordeel is ook de performancewinst omdat je array-element al meteen verwijst naar de div zodat je ook niet elke keer performance vretende document.getElelementById's hoeft te doen :)

Intentionally left blank


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

crisp schreef op 02 augustus 2002 @ 08:26:
Het idee om object referenties in een globale array te stoppen is al vaker langsgekomen naar mijn idee
Het punt is juist dat je GEEN global aray wil gebruiken. What's the point of using objects als je toch vage losse globals gaat gebruiken.

Daarom ben ik juist bezig een Timer object te schrijven, onderstaande is slechts een probeersel wat vannacht te binnen schoot....

:)

"You're only as good, as what you did last week."

Pagina: 1