Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[js] error: too much recursion

cor0612
9 antwoorden
  • Ik wil op een site na het klikken op een link een webcam tonen. Deze moet om een bepaalde tijd gerefreshd worden.
    Ik maakte daarvoor deze code:
    [code:1:068eb650b9]function show_webcam(img_id) {
    var webcam_img = document.getElementById('webcam_img');
    var src_url = '';
    var alt_text = 'webcam';
    var reload_time = '';
    var time = new Date();
    time = time.getTime(); //maak var time aan voor altijd andere url, zodat er wel echt gerefreshd wordt.

    //set de webcam url, alt-text en reload tijd
    if(img_id == 1) {
    src_url = "http://cam.alpinservers.net/cam/panorama.jpg";
    reload_time = 5*1000;
    }
    if(img_id == 2) {
    src_url = "http://83.215.250.50/cgi-bin/jpg/image.cgi?resolution=352x288";
    reload_time = 60*1000;
    }
    //enz..

    webcam_img.src = src_url + "?t=" + time;
    webcam_img.alt = alt_text;
    webcam_img.title = alt_text;

    setTimeout(show_webcam(img_id),reload_time);
    }
    [/code:1:068eb650b9]
    dan krijg ik echter de error: too much recursion. Wat kan ik daar aan doen? Het ligt aan deze regel: [code:1:068eb650b9]setTimeout(show_webcam(img_id),reload_time);[/code:1:068eb650b9]
    Alvast bedankt.
    [size=8:068eb650b9]P.S. ik ben js aan het leren, dus vandaar al die vragen… :wink:[/size:068eb650b9]
  • De method setTimeout vraagt een function reference of een stukje code als eerste parameter. In het eerste geval geef je alleen de naam van de functie op (dus zonder haakjes) en in het tweede geval geef je een string die de code bevat die moet worden uitgevoerd.

    Function reference:
    [code:1:783784869b]
    function hallo() { alert('hallo'); }

    setTimeout(hallo, 1000);
    [/code:1:783784869b]

    Code:
    [code:1:783784869b]
    function hallo() { alert('hallo'); }

    setTimeout("hallo()", 1000);
    [/code:1:783784869b]
    Als je de 1e parameter in de setTimeout niet tussen quotes zet en deze bevat een function() dan wordt deze direct uitgevoerd. Het resultaat van de function (de return value) zal dan als 1e parameter voor de setTimeout worden gebruikt. In jouw geval was dit dus de fout: show_webcam werd meteen aangeroepen, daarin zit een setTimeout die show_webcam weer direct aanroept, enz, enz. Et voilà, een oneindige recursie.

    De oplossing:
    Omdat je nog een parameter aan de functie wil meegeven, zal je de tweede methode moeten gebruiken*. Daarbij is het de bedoeling dat we de img_id in de functieaanroep 'plakken'.
    Je code moet dus het volgende worden:
    [code:1:783784869b] setTimeout('show_webcam('+img_id+')', reload_time);[/code:1:783784869b]
    Btw. als we de img_id er niet tussen 'plakken', maar gewoon "show_webcam(img_id)" op zouden geven, dan zou dat niet werken. Na de aanroep van setTimeout zal de functie show_webcam worden afgerond en is img_id niet meer beschikbaar (out of scope). Op het moment dat de string in setTimeout wordt geëvalueerd, is img_id dus niet bekend.


    [size=9:783784869b]* Mozilla ondersteund ook een syntax waarbij je na de 2e parameter nog parameters voor de functie die je aanroept kan opgeven. Helaas wordt dat niet door IE ondersteunt.[/size:783784869b]
    [code:1:783784869b]
    function hallo(a,b,c) { alert(a+b+c); }

    setTimeout(hallo, 1000, 'ik ', 'zeg ', 'hoi');
    [/code:1:783784869b]
  • Bedankt voor de zeer duidelijke uitleg en natuurlijk voor de oplossing!
  • het volgende probleem is dat als ik deze functie opnieuw aanroep met een andere id, zodat er een andere afbeelding zou moeten worden getoond, de setTimeout doorgaat. Dus zorgt de setTimeout er voor dat de vorige afbeelding wordt getoond. Het effect is dan dat de verschillende webcams omstebeurt knipperen.
    Kan een setTimeout ook weer worden stopgezet?
  • Jawel, dat kan zeker. De setTimeout functie retourneert een timerId, deze kan je gebruiken om met clearTimeout de timeout te annuleren.
    [code:1:50cd5f21d8]
    var t = setTimeout("alert('hoi')", 10000);

    clearTimeout(t);
    [/code:1:50cd5f21d8]
  • Ik doe nu aan het begin een clearTimeout zodat elke keer als de functie geladen wordt, de timeouts stoppen.
    Aan het einde zet ik de timeout in een variabele.

    Toch blijven de webcams door elkaar knipperen. Hoe kan dit komen?
  • Kan je eens je code tonen die je tot nu toe hebt? Of misschien een online voorbeeldje?
    Ik kan nu niet echt een direct antwoord verzinnen waar het aan ligt.
  • Ik heb de site even online gezet: klikje.
    Klik allebei de links (cam 1 en cam 2) achter elkaar aan het ongewenste 'wissel' effect verschijnt.
    Soms is de ene cam wat trager waardoor dat plaatje niet te voorschijn komt. Maar het is ook zichtbaar in de statusbalk.
  • Je probleem is dat je de variabele [i:f99870fc91]webcam_refreshtime[/i:f99870fc91] binnen de functie (en dus lokaal) declareert. Na een volgende aanroep is deze var niet meer beschikbaar en kan dan de timeout dus ook niet meer worden geannuleerd.

    Vervang je functie [i:f99870fc91]show_webcam[/i:f99870fc91] met de volgende code en het werkt weer.

    [code:1:f99870fc91]
    var webcam_refreshtime;
    function show_webcam(img_id) {
    var webcam_img = document.getElementById('webcam_img');
    var src_url = '';
    var alt_text = 'webcam';
    var reload_time = '';
    var time = new Date();
    time = time.getTime();//maak var time aan voor altijd andere url, zodat er wel echt gerefreshd wordt.

    //set de webcam url, alt-text en reload tijd
    if(img_id == 1) {
    src_url = "http://cam.alpinservers.net/cam/panorama.jpg" + "?t=" + time;
    reload_time = 5*1000;
    }
    if(img_id == 2) {
    src_url = "http://83.215.250.50/cgi-bin/jpg/image.cgi?resolution=352x288" + "&t=" + time;
    reload_time = 5*1000;
    }

    webcam_img.src = src_url;
    webcam_img.alt = alt_text;
    webcam_img.title = alt_text;

    clearTimeout(webcam_refreshtime);
    webcam_refreshtime = setTimeout('show_webcam('+img_id+')', reload_time);
    }[/code:1:f99870fc91]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.