Używam pliku biblioteki JavaScript Direct Web Remoting (DWR) i pojawia się błąd tylko w przeglądarce Safari (komputer stacjonarny i iPad)
To mówi
Przekroczono maksymalny rozmiar stosu wywołań.
Co dokładnie oznacza ten błąd i czy przestaje on całkowicie przetwarzać?
Również wszelkie poprawki dla Safari
przeglądarki (w rzeczywistości iPad Safari
mówi
JS: wykonanie przekroczyło limit czasu
zakładam, że to ten sam problem ze stosem wywołań)
data
w ajax. Naprawiono błąd, deklarując zmienne.Odpowiedzi:
Oznacza to, że gdzieś w kodzie wywołujesz funkcję, która z kolei wywołuje inną funkcję i tak dalej, dopóki nie osiągniesz limitu stosu wywołań.
Jest to prawie zawsze spowodowane funkcją rekurencyjną z przypadkiem podstawowym, który nie jest spełniony.
Wyświetlanie stosu
Rozważ ten kod ...
Oto stos po kilku połączeniach ...
Jak widać, stos wywołań rośnie, aż osiągnie limit: rozmiar stosu w przeglądarce lub wyczerpanie pamięci.
Aby to naprawić, upewnij się, że funkcja rekurencyjna ma przypadek podstawowy, który można spełnić ...
źródło
Czasami możesz to uzyskać, jeśli przypadkowo zaimportujesz / osadzisz ten sam plik JavaScript dwa razy, co warto sprawdzić na karcie zasobów inspektora.
źródło
W moim przypadku wysyłałem elementy wejściowe zamiast ich wartości:
Zamiast:
To zamroziło moją kartę Chrome do tego stopnia, że nawet nie pokazało mi okna dialogowego „Czekaj / zabij”, gdy strona przestała reagować ...
źródło
Gdzieś w kodzie znajduje się pętla rekurencyjna (tj. Funkcja, która ostatecznie wywołuje się wielokrotnie, aż stos się zapełni).
Inne przeglądarki albo mają większe stosy (zamiast tego dostajesz limit czasu), albo z jakiegoś powodu połykają błąd (być może źle ustawiony try-catch).
Za pomocą debugera sprawdź stos wywołań, gdy wystąpi błąd.
źródło
Problem z wykrywaniem przepełnienia stosu polega na tym, że ślad stosu się odpręża i nie można zobaczyć, co się właściwie dzieje.
Uznałem, że niektóre z nowszych narzędzi do debugowania w Chrome są przydatne do tego.
Naciśnij
Performance tab
, upewnij się, żeJavascript samples
są włączone, a dostaniesz coś takiego.To oczywiste, gdzie jest przepełnienie! Jeśli klikniesz
extendObject
, będziesz w stanie zobaczyć dokładny numer wiersza w kodzie.Możesz także zobaczyć czasy, które mogą być pomocne lub nie, lub czerwony śledź.
Kolejną przydatną sztuczką, jeśli nie możesz znaleźć problemu, jest umieszczenie wielu
console.log
stwierdzeń tam, gdzie Twoim zdaniem jest problem. Poprzedni krok powyżej może ci w tym pomóc.W Chrome, jeśli wielokrotnie wyprowadzasz identyczne dane, wyświetli się w ten sposób, pokazując, gdzie problem jest wyraźniejszy. W tym przypadku stos uderzył w 7152 klatek, zanim ostatecznie się zawiesił:
źródło
W moim przypadku konwertowałem tablicę dużych bajtów na ciąg znaków, używając:
bytes
zawiera kilka milionów wpisów, które są zbyt duże, aby zmieścić się na stosie.źródło
var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});
W moim przypadku zdarzenie click propagowało się na elemencie potomnym. Musiałem więc powiedzieć:
na zdarzenie kliknięcia:
Oto kod HTML:
źródło
Sprawdź szczegółowe informacje o błędzie w konsoli paska narzędzi Chrome dla programistów, to da ci funkcje na stosie wywołań i poprowadzi cię do rekurencji, która powoduje błąd.
źródło
Jeśli z jakiegoś powodu potrzebujesz nieskończonego procesu / rekurencji, możesz użyć webworkera w osobnym wątku. http://www.html5rocks.com/en/tutorials/workers/basics/
jeśli chcesz manipulować elementami domowymi i przerysować, użyj animacji http://creativejs.com/resources/requestanimationframe/
źródło
Prawie każda odpowiedź tutaj stwierdza, że może to być spowodowane tylko nieskończoną pętlą. To nie jest prawda, w przeciwnym razie można by przekroczyć stos poprzez głęboko zagnieżdżone wywołania (nie mówiąc, że jest to wydajne, ale z pewnością jest to możliwe). Jeśli masz kontrolę nad maszyną wirtualną JavaScript, możesz dostosować rozmiar stosu. Na przykład:
node --stack-size=2000
Zobacz także: Jak zwiększyć maksymalny rozmiar stosu wywołań w Node.js
źródło
W moim przypadku dwa moduły jQuery były ułożone jeden na drugim. Zapobieganie to rozwiązało mój problem.
źródło
Niedawno dodaliśmy pole do strony administratora, nad którą pracujemy - typ_kontaktu ... łatwe, prawda? Cóż, jeśli wywołasz select „typ” i spróbujesz wysłać go przez wywołanie ajax jquery, to nie powiedzie się z tym błędem ukrytym głęboko w jquery.js Nie rób tego:
Problem polega na tym, że typ: typ - myślę, że to my nazywamy argument „typ” - posiadanie zmiennej wartości o nazwie typ nie jest problemem. Zmieniliśmy to na:
I odpowiednio przepisałem some_function.php - problem rozwiązany.
źródło
Sprawdź, czy masz funkcję, która się wywołuje. Na przykład
źródło
Może to również powodować
Maximum call stack size exceeded
błąd:To samo tutaj:
Z Dokumentów Mozilla :
Więc spróbuj:
źródło
Oba wywołania tego samego kodu poniżej, jeśli zostaną zmniejszone o 1, działają w Chrome 32 na moim komputerze, np. 17905 vs. 17904. Jeśli zostaną uruchomione, spowodują błąd „RangeError: Przekroczono maksymalny rozmiar stosu wywołań”. Wydaje się, że ten limit nie jest zakodowany na stałe, ale zależy od sprzętu twojego komputera. Wygląda na to, że jeśli zostanie wywołany jako funkcja, to narzucony przez siebie limit jest wyższy niż przy wywołaniu jako metoda, tzn. Ten konkretny kod zużywa mniej pamięci po wywołaniu jako funkcja.
Wywoływany jako metoda:
Wywoływany jako funkcja:
źródło
możesz znaleźć swoją funkcję rekurencyjną w przeglądarce crome, naciśnij ctrl + shift + j, a następnie kartę źródłową, co daje przepływ kompilacji kodu i możesz znaleźć za pomocą punktu przerwania w kodzie.
źródło
Napotkałem również podobny problem, tutaj są szczegóły podczas przesyłania logo za pomocą rozwijanego pola przesyłania logo
CSS.css
przed korektą mój kod był:
Błąd w konsoli:
Rozwiązałem go, usuwając
onclick="$('#filePhoto').click()"
z tagu div.źródło
Miałem do czynienia z tym samym problemem, który rozwiązałem, usuwając nazwę pola, która była używana dwukrotnie w ajax np
źródło
Wiem, że ten wątek jest stary, ale myślę, że warto wspomnieć o scenariuszu, w którym znalazłem ten problem, aby mógł pomóc innym.
Załóżmy, że masz takie elementy zagnieżdżone:
Nie można manipulować zdarzeniami elementu potomnego w zdarzeniu jego elementu nadrzędnego, ponieważ propaguje się ono do siebie, wykonując wywołania rekurencyjne, dopóki wyjątek nie zostanie zgłoszony.
Więc ten kod zawiedzie:
Masz dwie opcje, aby tego uniknąć:
źródło
Miałem ten błąd, ponieważ miałem dwie funkcje JS o tej samej nazwie
źródło
Jeśli pracujesz z mapami Google, sprawdź, czy są one przekazywane w
new google.maps.LatLng
odpowiednim formacie. W moim przypadku były one uznawane za niezdefiniowane.źródło
Problem w moim przypadku polega na tym, że mam trasy dzieci z tą samą ścieżką z rodzicem:
Musiałem więc usunąć linię z trasy dla dzieci
źródło
w moim przypadku otrzymuję ten błąd przy wywołaniu ajax, a dane, które próbowałem przekazać, nie zostały zdefiniowane, co pokazuje mi ten błąd, ale nie opisuję tej zmiennej, która nie została zdefiniowana. Dodałem zdefiniowane, że zmienna n ma wartość.
źródło
Dotarłem do tego samego problemu, nie mogłem zrozumieć, co jest nie tak, że zaczął obwiniać Babel;)
Kod nie zwraca żadnych wyjątków w przeglądarkach:
problem został źle utworzony || (lub) część, ponieważ babel tworzy własną kontrolę typu:
więc usuwam
sprawiło, że transpilacja babel działała.
źródło
W moim przypadku przez pomyłkę przypisałem tę samą nazwę zmiennej i do funkcji val „class_routine_id”
powinno być jak:
źródło
w Angular, jeśli używasz mat-select i masz ponad 400 opcji, może wystąpić błąd https://github.com/angular/components/issues/12504
musisz zaktualizować @ wersję kątową / materiałową
źródło
Używam React-Native 0.61.5 wraz z ( npm 6.9.0 i węzeł 10.16.1 )
Podczas gdy instaluję nowe biblioteki w Project, mam
(np. npm install @ reag-navigation / native --save)
Błąd maksymalnego rozmiaru stosu wywołań
do tego próbuję
sudo npm cache clean --force
(Uwaga: - Poniższe polecenie zwykle zajmuje od 1 do 2 minut w zależności od wielkości pamięci podręcznej npm )
źródło
Czasami zdarzało się z powodu konwersji typu danych, na przykład masz obiekt, który uważałeś za ciąg znaków.
socket.id w nodejs w kliencie js jako przykład nie jest łańcuchem. aby użyć go jako ciągu, musisz dodać słowo Ciąg przed:
źródło
Próbowałem przypisać zmienną, wartość, gdy ta zmienna nie została zadeklarowana.
Zadeklarowanie zmiennej naprawiło mój błąd.
źródło