[JS] Functie doorgeven in een (recursieve) functie

Pagina: 1
Acties:

  • miniK0bo
  • Registratie: December 2001
  • Laatst online: 11-05-2024
Ik heb een recursieve functie gebouwd met een ingebouwde vertraging dmv een timeout in de recursie.

De recursie wordt afgebroken zodra deze niet meer aan een bepaalde voorwaarde voldoet.
Zodra deze afgerond is wil ik aan het eind van deze recursie een functie kunnen uitvoeren die ik als variabele meegeef bij de aanroep van de recursie.

Voorbeeld (werkend):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function btnTest() {
    testLoop(from=0, to=10, fnDoSomethingWhenFinished);
}

function fnDoSomethingWhenFinished() {
    alert('klaar!');
}

function testLoop(loopFrom, loopTill, handler) {
    if (loopFrom<loopTill) {
        //testLoop(loopFrom+1, loopTill, handler)  //functie zonder timeout (vertraging)
        setTimeout("testLoop('" + loopFrom+1 + "', " + loopTill + ", " + handler +")", 12)
    } else {
        //doe iets wanneer het klaar is
        handler;
    }
}


De recursie werkt gewoon. Het probleem zit hem in het uitvoeren van de functie aan het einde van de recursie.

De timeout die in de recursie zit is een must. (Denk maar aan een stopwatch die tot 60 moet tellen en elke seconde het getal op scherm update en zodra 60 bereikt is iets moet gaan doen).

Ideeën waar de fout zit?

  • Sendy
  • Registratie: September 2001
  • Niet online
Heeft een functie (die je gaat uitvoeren) niet altijd argumenten (of een lege argumenten string?) Een functie reference is net zoiets als een getal. Je laatste statement kan je dus vergelijken met
code:
1
5;

[ Voor 46% gewijzigd door Sendy op 19-03-2006 17:09 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
je hebt natuurlijk zelf al wat debugwerk gedaan?
bijv. een alert() aan het begin van de testLoop functie die zowel loopFrom als loopTill uitpoept?

This message was sent on 100% recyclable electrons.


  • miniK0bo
  • Registratie: December 2001
  • Laatst online: 11-05-2024
natuurlijk heb ik zelf al debug werk gedaan.
voorbeeldje in de post werk ook gewoon (je moet alleen nog html er aan hangen).

recursie werkt gewoon netjes.
als je aan het eind de 'handler' toont >> alert(handler); dan verschijnt de functie gewoon.

:: Sendy bedoel je met parameter > argumenten?
over welke laatste statement heb je het precies?

  • Sendy
  • Registratie: September 2001
  • Niet online
Ik bedoel inderdaad argumenten, en ik heb het over statement 15. Ik heb het in bovenstaande gewijzigd, ik merkte dat er nog meer onduidelijkheden in stonden.

[ Voor 43% gewijzigd door Sendy op 19-03-2006 17:09 ]


Verwijderd

Wat is deze regel :?
testLoop(from=0, to=10, fnDoSomethingWhenFinished);

Moet dan niet het volgende zijn:
testLoop(0, 10, fnDoSomethingWhenFinished);

Wat probeer je verder te bereiken? Werkt het niet of?

  • Fuzzillogic
  • Registratie: November 2001
  • Laatst online: 01-07-2025
Maak van regel 15 eens handler(); :)

[edit]Ach ik kijk weer half. Je kunt setTimeout ook functies meegeven, maar argumenten aan die functie meegeven is vziw dan weer niet mogelijk. Dus bijv:
code:
1
setTimeout(handler,500);

Argumenten kun je ergens in global space doorgeven. Niet netjes, maarja.
Zo te zien geeft Gordijnstok de oplossing. Thanks, die kan ik ook prima gebruiken :)

[edit2]
Heee misschien moet ik eens denken voordat ik post!

Gordijnstok, een nadeel van jouw oplossing is dat je dan geen dynamische handler meer kunt meegeven. Dat is hier geen probleem, maar je kunt bijv. geen delayed execution functie maken. M.a.w, zou je de aanroep die setTimeout doet dynamisch kunnen houden, zoals m'n voorbeeldje hierboven, mét argumenten?

* Fuzzillogic heeft zijn dag niet.

[ Voor 137% gewijzigd door Fuzzillogic op 19-03-2006 17:23 ]


Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function btnTest() {
    testLoop(0,10,fnDoSomethingWhenFinished);
}

function fnDoSomethingWhenFinished() {
    alert('klaar!');
}

function testLoop(loopFrom, loopTill, handler) {
    if(loopFrom<loopTill){
        loopFrom++;
        setTimeout(function(){testLoop(loopFrom,loopTill,handler)},12);
    }else{
        handler();
    }
}

[ Voor 4% gewijzigd door Verwijderd op 19-03-2006 17:14 . Reden: verdammd Nex.. :P ]


  • miniK0bo
  • Registratie: December 2001
  • Laatst online: 11-05-2024
wauw, bedankt voor de supersnelle reacties!!

het probleem zat 'm dus in deze twee:

setTimeout(function(){testLoop(loopFrom,loopTill,handler)},12);
handler();

TNX!! :)

Verwijderd

Nexxennium schreef op zondag 19 maart 2006 @ 17:10:
Gordijnstok, een nadeel van jouw oplossing is dat je dan geen dynamische handler meer kunt meegeven. Dat is hier geen probleem, maar je kunt bijv. geen delayed execution functie maken. M.a.w, zou je de aanroep die setTimeout doet dynamisch kunnen houden, zoals m'n voorbeeldje hierboven, mét argumenten?
Mijn aanroep verschilt niet van de wijze waarop de TS zijn functies meegaf, alleen is die anders opgebouwd. Nog steeds kun je dynamisch je hele ding meegeven :) Ik geef hem alleen nu direct de attributes mee, maar daar kun je zelf ook wat van maken als je dat zou willen.

[ Voor 10% gewijzigd door Verwijderd op 19-03-2006 18:07 ]

Pagina: 1