web-dev-qa-db-fra.com

setTimeout et jQuery: Uncaught RangeError: La taille maximale de la pile d'appels a été dépassée

J'essaie d'appeler ma classe pendant le chargement de la page, ainsi que de recharger les résultats toutes les X secondes. Toutefois, à la suite des didacticiels de setTimeout, jquery semble me jeter une erreur que je ne comprends pas, vu que c'est sans syntaxe.

Uncaught RangeError: La taille maximale de la pile d'appels a été dépassée 

var Rand = function() {
    return Math.random().toString(36).substr(2);
};

lhc();

function lhc(){
    $('#lhcb a').each(function() {
        var rawlink = $(this).attr("href");
        var link = encodeURIComponent( rawlink );
        var token = Rand();
        var href = $(this).prop('href');
        var proceed = $.getJSON( "lhc/link.php?link=" + link + "&a=c", function( data ) {
            if ( data.proceed == 'true' ) {
                return true;
            } else {
                return false;
            }
        }).error(function(e) { alert("error"); console.log(e);});
        if ( href.match("^javascript:") ) {
            proceed = false;
        }
        if ( rawlink.charAt(0) != '#' ) {
            if ( proceed ) {
                $(this).after( " <span style='font-size:xx-small;'>( Hits: <span id='" + token + "'></span> )</span>" );
                    $.getJSON( "lhc/link.php?link=" + link + "&a=q", function( data ) {
                        $('#' + token).html(data['hits']);
                    }).error(function(e) { alert("error"); console.log(e);});
                $(this).attr( "href", "lhc/link.php?link=" + link + "&a=g" );
            }
        }

    });
    setTimeout(lhc(), 5000);
}
10
WASasquatch

Changement

setTimeout(lhc(), 5000);

à

setTimeout(lhc, 5000);

Vous appelez la fonction directement sans délai lorsque vous ajoutez la parenthèse et l'appelez immédiatement dans la même fonction devient rapidement une boucle sans fin qui remplit la pile

26
adeneo

Vous pouvez ignorer l'erreur si vous exécutez <script>window.onerror = function(){ return true;} </script> Et définissez setTimeout(lhc, 5000); certains.

0
Rogerio de Moraes