Heim >Backend-Entwicklung >PHP-Tutorial >javascript – rekursive JS-Funktion, meldet einen Stapelüberlauffehler, nachdem sie mehr als 500 Mal ausgeführt wurde?
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
JS-Neuling, bitte geben Sie mir einen Rat~~
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
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 >.出栈
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.