Ich verwende eine Direct Web Remoting (DWR) -JavaScript-Bibliotheksdatei und erhalte nur in Safari (Desktop und iPad) eine Fehlermeldung.
Es sagt
Maximale Call-Stack-Größe überschritten.
Was genau bedeutet dieser Fehler und stoppt er die Verarbeitung vollständig?
Auch irgendein Fix für den Safari
Browser (Eigentlich auf dem iPad Safari
, heißt es
JS: Die Ausführung hat das Zeitlimit überschritten
Ich gehe davon aus, dass es sich um dasselbe Call-Stack-Problem handelt.
data
in Ajax durch zu senden . Der Fehler wurde durch Deklarieren der Variablen behoben.Antworten:
Dies bedeutet, dass Sie irgendwo in Ihrem Code eine Funktion aufrufen, die wiederum eine andere Funktion usw. aufruft, bis Sie das Aufrufstapellimit erreicht haben.
Dies liegt fast immer an einer rekursiven Funktion mit einem Basisfall, der nicht erfüllt wird.
Stapel anzeigen
Betrachten Sie diesen Code ...
Hier ist der Stapel nach einer Handvoll Aufrufen ...
Wie Sie sehen können, wächst der Aufrufstapel, bis er ein Limit erreicht: die fest codierte Stapelgröße des Browsers oder die Speicherauslastung.
Um dies zu beheben, stellen Sie sicher, dass Ihre rekursive Funktion einen Basisfall hat, der erfüllt werden kann ...
quelle
Dies kann manchmal vorkommen, wenn Sie versehentlich zweimal dieselbe JavaScript-Datei importieren / einbetten. Überprüfen Sie dazu die Registerkarte "Ressourcen" des Inspektors.
quelle
In meinem Fall habe ich Eingabeelemente anstelle ihrer Werte gesendet:
Anstatt:
Dadurch wurde mein Chrome-Tab bis zu einem Punkt eingefroren, an dem nicht einmal der Dialog "Warten / Töten" angezeigt wurde, als die Seite nicht mehr reagierte ...
quelle
Irgendwo in Ihrem Code befindet sich eine rekursive Schleife (dh eine Funktion, die sich schließlich immer wieder selbst aufruft, bis der Stapel voll ist).
Andere Browser haben entweder größere Stapel (sodass Sie stattdessen eine Zeitüberschreitung erhalten) oder sie verschlucken den Fehler aus irgendeinem Grund (möglicherweise ein schlecht platzierter Try-Catch).
Verwenden Sie den Debugger, um den Aufrufstapel zu überprüfen, wenn der Fehler auftritt.
quelle
Das Problem beim Erkennen von Stapelüberläufen besteht darin, dass sich die Stapelverfolgung manchmal abwickelt und Sie nicht sehen können, was tatsächlich vor sich geht.
Ich habe einige der neueren Debugging-Tools von Chrome dafür nützlich gefunden.
Klicken Sie auf
Performance tab
, stellen Sie sicher, dassJavascript samples
aktiviert ist, und Sie erhalten so etwas.Es ist ziemlich offensichtlich, wo der Überlauf hier ist! Wenn Sie auf klicken
extendObject
, wird die genaue Zeilennummer im Code angezeigt.Sie können auch Timings sehen, die hilfreich sein können oder nicht, oder einen roten Hering.
Ein weiterer nützlicher Trick, wenn Sie das Problem nicht finden können, besteht darin, viele
console.log
Aussagen dort zu platzieren, wo Sie glauben, dass das Problem liegt. Der vorherige Schritt oben kann Ihnen dabei helfen.Wenn Sie in Chrome wiederholt identische Daten ausgeben, werden diese wie folgt angezeigt, um zu zeigen, wo das Problem deutlicher liegt. In diesem Fall traf der Stapel 7152 Frames, bevor er schließlich abstürzte:
quelle
In meinem Fall habe ich ein großes Byte-Array wie folgt in einen String konvertiert:
bytes
enthielt mehrere Millionen Einträge, was zu groß ist, um auf den Stapel zu passen.quelle
var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});
In meinem Fall wurde das Klickereignis auf das untergeordnete Element übertragen. Also musste ich folgendes sagen:
On-Click-Ereignis:
Hier ist der HTML-Code:
quelle
Überprüfen Sie die Fehlerdetails in der Chrome Dev-Symbolleistenkonsole. Dadurch erhalten Sie die Funktionen im Aufrufstapel und werden zu der Rekursion geführt, die den Fehler verursacht.
quelle
Wenn Sie aus irgendeinem Grund einen unendlichen Prozess / eine unendliche Rekursion benötigen, können Sie einen Webworker in einem separaten Thread verwenden. http://www.html5rocks.com/de/tutorials/workers/basics/
Wenn Sie Dom-Elemente bearbeiten und neu zeichnen möchten, verwenden Sie die Animation http://creativejs.com/resources/requestanimationframe/.
quelle
Fast jede Antwort hier besagt, dass dies nur durch eine Endlosschleife verursacht werden kann. Das ist nicht wahr, Sie könnten den Stapel sonst durch tief verschachtelte Aufrufe überlaufen lassen (um nicht zu sagen, dass dies effizient ist, aber es liegt sicherlich im Bereich des Möglichen). Wenn Sie die Kontrolle über Ihre JavaScript-VM haben, können Sie die Stapelgröße anpassen. Zum Beispiel:
node --stack-size=2000
Siehe auch: Wie kann ich die maximale Größe des Aufrufstapels in Node.js erhöhen?
quelle
In meinem Fall wurden zwei jQuery-Modale übereinander gestapelt angezeigt. Das zu verhindern löste mein Problem.
quelle
Wir haben kürzlich ein Feld zu einer Admin-Site hinzugefügt, an der wir arbeiten - contact_type ... einfach, oder? Wenn Sie den ausgewählten "Typ" aufrufen und versuchen, ihn über einen Ajquery-Ajax-Aufruf zu senden, schlägt dies mit diesem Fehler fehl, der tief in jquery.js vergraben ist. Tun Sie dies nicht:
Das Problem ist der Typ: Typ - ich glaube, wir nennen das Argument "Typ" - eine Wertvariable namens Typ zu haben, ist nicht das Problem. Wir haben dies geändert in:
Und schrieb some_function.php entsprechend um - Problem gelöst.
quelle
Überprüfen Sie, ob Sie eine Funktion haben, die sich selbst aufruft. Zum Beispiel
quelle
Dies kann auch einen
Maximum call stack size exceeded
Fehler verursachen:Hier gilt das gleiche:
Aus den Mozilla Docs :
Also versuche:
quelle
Beide Aufrufe des identischen Codes unten, wenn sie um 1 verringert wurden, funktionieren in Chrome 32 auf meinem Computer, z. B. 17905 gegenüber 17904. Wenn sie so ausgeführt werden, wird der Fehler "RangeError: Maximale Aufrufstapelgröße überschritten" angezeigt. Es scheint, dass diese Grenze nicht fest codiert ist, sondern von der Hardware Ihres Computers abhängt. Es scheint, dass beim Aufrufen als Funktion diese selbst auferlegte Grenze höher ist als beim Aufrufen als Methode, dh dieser bestimmte Code benötigt weniger Speicher, wenn er als Funktion aufgerufen wird.
Als Methode aufgerufen:
Wird als Funktion aufgerufen:
quelle
Sie finden Ihre rekursive Funktion im Crome-Browser. Drücken Sie Strg + Umschalt + J und dann die Registerkarte Quelle. Dadurch erhalten Sie einen Code-Kompilierungsfluss und können den Haltepunkt im Code verwenden.
quelle
Ich hatte auch ein ähnliches Problem mit den Details beim Hochladen des Logos über das Dropdown-Feld zum Hochladen des Dropdown-Logos
CSS.css
Vor der Korrektur war mein Code:
Der Fehler in der Konsole:
Ich habe es gelöst, indem ich es
onclick="$('#filePhoto').click()"
vom div-Tag entfernt habe.quelle
Ich hatte das gleiche Problem, das ich behoben habe, indem ich einen Feldnamen entfernt habe, der zweimal bei Ajax verwendet wurde, z
quelle
Ich weiß, dass dieser Thread alt ist, aber ich denke, es lohnt sich, das Szenario zu erwähnen, in dem ich dieses Problem gefunden habe, damit es anderen helfen kann.
Angenommen, Sie haben folgende verschachtelte Elemente:
Sie können die Ereignisse des untergeordneten Elements nicht innerhalb des Ereignisses des übergeordneten Elements bearbeiten, da es sich selbst überträgt und rekursive Aufrufe ausführt, bis die Ausnahme ausgelöst wird.
Dieser Code schlägt also fehl:
Sie haben zwei Möglichkeiten, um dies zu vermeiden:
quelle
Ich hatte diesen Fehler, weil ich zwei JS-Funktionen mit demselben Namen hatte
quelle
Wenn Sie mit Google Maps arbeiten, überprüfen Sie, ob die Daten, die übergeben
new google.maps.LatLng
werden, ein geeignetes Format haben. In meinem Fall wurden sie als undefiniert übergeben.quelle
Das Problem in meinem Fall ist, dass Kinder mit demselben Pfad wie die Eltern routen:
Also musste ich die Linie der Kinderroute entfernen
quelle
In meinem Fall erhalte ich diesen Fehler beim Ajax-Aufruf und die Daten, die ich versucht habe, diese Variable zu übergeben, sind nicht definiert. Dies zeigt mir diesen Fehler, beschreibt aber nicht die nicht definierte Variable. Ich habe definiert hinzugefügt, dass die Variable n einen Wert hat.
quelle
Ich bin auf dasselbe Problem gestoßen und habe nicht herausgefunden, was falsch ist. Ich habe Babel die Schuld gegeben;)
Code, der in Browsern keine Ausnahme zurückgibt:
Problem wurde schlecht erstellt || (oder) Teil als Babel erstellt eine eigene Typprüfung:
also entfernen
machte Babel Transpilation funktioniert.
quelle
In meinem Fall habe ich versehentlich den gleichen Variablennamen und die Val-Funktion "class_routine_id" zugewiesen.
es sollte sein wie:
quelle
Wenn Sie in Angular mat-select verwenden und über 400 Optionen verfügen, kann dieser Fehler unter https://github.com/angular/components/issues/12504 auftreten
Sie müssen @ Angular / Material-Version aktualisieren
quelle
Ich verwende React-Native 0.61.5 zusammen mit ( npm 6.9.0 & Node 10.16.1 )
Während ich neue Bibliotheken in Project installiere, habe ich eine von
(zB npm install @ react-navigation / native --save)
Die maximale Größe des Aufrufstapels hat den Fehler überschritten
dafür versuche ich
sudo npm cache clean --force
(Hinweis: - Der folgende Befehl benötigt normalerweise 1 bis 2 Minuten, abhängig von Ihrer npm-Cache- Größe.)
quelle
Manchmal ist dies aufgrund des Konvertierungsdatentyps passiert. Beispielsweise haben Sie ein Objekt, das Sie als Zeichenfolge betrachtet haben.
socket.id in nodejs, entweder in js client als Beispiel, ist keine Zeichenfolge. Um es als Zeichenfolge zu verwenden, müssen Sie vorher das Wort Zeichenfolge hinzufügen:
quelle
Ich habe versucht, eine Variable, einen Wert, zuzuweisen, wenn diese Variable nicht deklariert wurde.
Das Deklarieren der Variablen hat meinen Fehler behoben.
quelle