Heim >Backend-Entwicklung >PHP-Tutorial >javascript – rekursive JS-Funktion, meldet einen Stapelüberlauffehler, nachdem sie mehr als 500 Mal ausgeführt wurde?

javascript – rekursive JS-Funktion, meldet einen Stapelüberlauffehler, nachdem sie mehr als 500 Mal ausgeführt wurde?

WBOY
WBOYOriginal
2016-09-19 09:16:341272Durchsuche

1. Bei der PHP-Entwicklung müssen mehr als 1700 XML-Dateidaten gelesen und in der Datenbank gespeichert werden. Meine Methode besteht darin, die js-Funktionsrekursion im Frontend zu verwenden und sie einzeln über AJAX zu übermitteln. Das aktuelle Problem besteht darin, dass die rekursive Funktion von js etwa 500 Mal ausgeführt wird und der Browser einen Stapelüberlauffehler meldet und die Ausführung stoppt.
2. Rekursive Front-End-Funktion:
Funktion update_hotelInfo_queue(data,i)

<code>    {
        if(i==(data.length-1))
        {
            return;
        }
        $("#processInfo").html("正在处理第"+(i+1)+"个城市数据<br>");
        var url="__CONTROLLER__/updateHotelInfo";
        var cityID=data[i];
        console.log(i+"==>"+cityID);
        $.ajax({
            url:url,
            cache:false,
            async:false,
            dataType:"json",
            type:"POST",
            data:{cityID:cityID},
            success:function()
            {
                update_hotelInfo_queue(data,i+1)
            }

        })
    }
    </code>

3. Dieser Fehler wird dadurch verursacht, dass der Browser annimmt, dass die aktuelle Rekursion eine Endlosschleife ist?
4. Ergänzende Fehlerinformationen
javascript – rekursive JS-Funktion, meldet einen Stapelüberlauffehler, nachdem sie mehr als 500 Mal ausgeführt wurde?

JS-Neuling, bitte geben Sie mir einen Rat~~

Antwortinhalt:

1. Bei der PHP-Entwicklung müssen mehr als 1700 XML-Dateidaten gelesen und in der Datenbank gespeichert werden. Meine Methode besteht darin, die js-Funktionsrekursion im Frontend zu verwenden und sie einzeln über AJAX zu übermitteln. Das aktuelle Problem besteht darin, dass die rekursive Funktion von js etwa 500 Mal ausgeführt wird und der Browser einen Stapelüberlauffehler meldet und die Ausführung stoppt.
2. Rekursive Front-End-Funktion:
Funktion update_hotelInfo_queue(data,i)

<code>    {
        if(i==(data.length-1))
        {
            return;
        }
        $("#processInfo").html("正在处理第"+(i+1)+"个城市数据<br>");
        var url="__CONTROLLER__/updateHotelInfo";
        var cityID=data[i];
        console.log(i+"==>"+cityID);
        $.ajax({
            url:url,
            cache:false,
            async:false,
            dataType:"json",
            type:"POST",
            data:{cityID:cityID},
            success:function()
            {
                update_hotelInfo_queue(data,i+1)
            }

        })
    }
    </code>

3. Dieser Fehler wird dadurch verursacht, dass der Browser annimmt, dass die aktuelle Rekursion eine Endlosschleife ist?
4. Ergänzende Fehlerinformationen
javascript – rekursive JS-Funktion, meldet einen Stapelüberlauffehler, nachdem sie mehr als 500 Mal ausgeführt wurde?

JS-Neuling, bitte geben Sie mir einen Rat~~

„Tail Call Optimization“ http://www.ruanyifeng.com/blo...

Der Vorteil rekursiver Funktionen besteht darin, dass sie den Code prägnant machen und mehr Dinge mit weniger Code erledigen können.

Aber ein großer Nachteil ist, dass es Speicher beansprucht. Wir wissen, dass jedes Mal, wenn eine Funktion aufgerufen wird, ein Teil des Speichers verbraucht wird, der als 进栈 bezeichnet wird >.出栈

Jedes Mal, wenn eine rekursive Funktion rekursiv ist, hängt sie vom Ergebnis der nächsten Rekursion ab, bevor sie ausgegeben werden kann. Auf diese Weise wird die Funktion immer in den Stapel verschoben, ohne dass sie aus dem Stapel herausspringt, und der Speicher bleibt erhalten besetzt und nicht rechtzeitig freigegeben.

Ihr Fehlerbericht ist also sinnvoll.

Die Lösung ist einfach. Es wird empfohlen, eine Schleife zu verwenden, sodass der Speicher bei jeder Ausführung der Schleife automatisch freigegeben wird, ohne dass jemand darauf angewiesen ist

Passen Sie den rekursiven Algorithmus an, um rekursive Tail Calls zu implementieren

Sie benötigen überhaupt keine Rekursion, verwenden Sie eine Schleife. Die Schwanzrekursion ist für js nutzlos und scheint nicht optimiert zu sein.

Der Abhängigkeitsrückruf von Ajax muss Promise-Defferd verwenden, aber es gibt mehr als 1.700 Datenelemente. Sind Sie sicher, dass Sie diese Methode verwenden möchten?

Wenn Sie Ihre vorherige Methode, die Rekursion, verwenden, prüfen Sie, ob Sie dies stapelweise durchführen können.

Verwenden Sie keine Rekursion, wenn Schleifen verwendet werden können. Rekursion wird verwendet, um Fälle zu lösen, in denen ein Schleifenalgorithmus zur Lösung von Problemen wie dem Turm von Hanoi verwendet wird. Der Preis der Rekursion ist Stackoverflow.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn