Estou usando um arquivo de biblioteca JavaScript do Direct Web Remoting (DWR) e estou recebendo um erro apenas no Safari (desktop e iPad)
Diz
Tamanho máximo da pilha de chamadas excedido.
O que exatamente esse erro significa e para de processar completamente?
Também qualquer correção para o Safari
navegador (na verdade iPad Safari
, diz
JS: execução excedeu o tempo limite
presumo que seja o mesmo problema da pilha de chamadas)
data
do ajax. Corrigido o erro declarando as variáveis.Respostas:
Isso significa que, em algum lugar do seu código, você está chamando uma função que, por sua vez, chama outra função e assim por diante, até atingir o limite da pilha de chamadas.
Isso ocorre quase sempre por causa de uma função recursiva com um caso base que não está sendo atendido.
Visualizando a pilha
Considere este código ...
Aqui está a pilha após um punhado de chamadas ...
Como você pode ver, a pilha de chamadas cresce até atingir um limite: o tamanho da pilha codificada pelo navegador ou o esgotamento da memória.
Para corrigi-lo, verifique se sua função recursiva possui um caso base que pode ser atendido ...
fonte
Às vezes, você pode obtê-lo se importar / incorporar acidentalmente o mesmo arquivo JavaScript duas vezes, vale a pena conferir na guia de recursos do inspetor.
fonte
No meu caso, eu estava enviando elementos de entrada em vez de seus valores:
Ao invés de:
Isso congelou minha guia do Chrome a um ponto em que nem me mostrou a caixa de diálogo 'Aguardar / Matar' para quando a página não respondesse ...
fonte
Existe um loop recursivo em algum lugar do seu código (ou seja, uma função que eventualmente se chama repetidamente até que a pilha esteja cheia).
Outros navegadores têm pilhas maiores (então você recebe um tempo limite) ou engolem o erro por algum motivo (talvez um try-catch mal colocado).
Use o depurador para verificar a pilha de chamadas quando o erro ocorrer.
fonte
O problema com a detecção de fluxos de empilhamento às vezes é que o rastreio da pilha se desenrola e você não consegue ver o que realmente está acontecendo.
Encontrei algumas das ferramentas de depuração mais recentes do Chrome úteis para isso.
Clique no
Performance tab
, verifique seJavascript samples
está ativado e você obterá algo assim.É bastante óbvio onde o estouro está aqui! Se você clicar em,
extendObject
poderá ver o número exato da linha no código.Você também pode ver horários que podem ou não ser úteis ou um arenque vermelho.
Outro truque útil, se você realmente não consegue encontrar o problema, é colocar muitas
console.log
instruções onde você acha que está o problema. A etapa anterior acima pode ajudá-lo com isso.No Chrome, se você gerar repetidamente dados idênticos, ele será exibido dessa maneira, mostrando onde o problema é mais claro. Nesse caso, a pilha atingiu 7152 quadros antes de finalmente travar:
fonte
No meu caso, eu estava convertendo uma matriz de bytes grandes em uma string usando o seguinte:
bytes
continha vários milhões de entradas, que são grandes demais para caber na pilha.fonte
var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});
No meu caso, o evento click foi propagado no elemento filho. Então, eu tive que colocar o seguinte:
no evento de clique:
Aqui está o código html:
fonte
Verifique os detalhes do erro no console da barra de ferramentas do desenvolvedor do Chrome, isso fornecerá as funções na pilha de chamadas e o guiará para a recursão que está causando o erro.
fonte
Se você precisar de um processo / recursão infinito em execução por algum motivo, poderá usar um webworker em um thread separado. http://www.html5rocks.com/en/tutorials/workers/basics/
se você deseja manipular elementos dom e redesenhar, use a animação http://creativejs.com/resources/requestanimationframe/
fonte
Quase todas as respostas aqui afirmam que isso só pode ser causado por um loop infinito. Isso não é verdade, você poderia sobrecarregar a pilha por meio de chamadas profundamente aninhadas (para não dizer que é eficiente, mas certamente está no campo possível). Se você tem controle da sua VM JavaScript, pode ajustar o tamanho da pilha. Por exemplo:
node --stack-size=2000
Consulte também: Como posso aumentar o tamanho máximo da pilha de chamadas no Node.js
fonte
No meu caso, dois modais jQuery estavam aparecendo empilhados uns sobre os outros. Prevenir isso resolveu meu problema.
fonte
Recentemente, adicionamos um campo ao site de administração em que estamos trabalhando - contact_type ... fácil, certo? Bem, se você chamar o select "type" e tentar enviá-lo através de uma chamada jquery ajax, ele falhará com esse erro oculto no jquery.js Não faça isso:
O problema é esse tipo: type - acredito que estamos nomeando o argumento "type" - ter uma variável de valor chamada type não é o problema. Alteramos isso para:
E reescrevi some_function.php de acordo - problema resolvido.
fonte
Verifique se você tem uma função que se chama. Por exemplo
fonte
Isso também pode causar um
Maximum call stack size exceeded
erro:O mesmo aqui:
No Mozilla Docs :
Então tente:
fonte
Ambas as invocações do código idêntico abaixo se diminuídas em 1 trabalho no Chrome 32 no meu computador, por exemplo, 17905 vs 17904. Se executadas como estão, produzirão o erro "RangeError: tamanho máximo da pilha de chamadas excedido". Parece que esse limite não é codificado, mas depende do hardware da sua máquina. Parece que se invocado como uma função, esse limite auto-imposto é mais alto do que se invocado como um método, ou seja, esse código específico usa menos memória quando invocado como uma função.
Chamado como um método:
Chamado como uma função:
fonte
você pode encontrar sua função recursiva no navegador crome, pressione ctrl + shift + j e, em seguida, na guia fonte, que fornece fluxo de compilação de código e você pode encontrar usando o ponto de interrupção no código.
fonte
Também enfrentei um problema semelhante. Aqui estão os detalhes ao fazer o upload do logotipo usando a caixa suspensa de upload do logotipo
CSS.css
antes da correção, meu código era:
O erro no console:
Eu o resolvi removendo
onclick="$('#filePhoto').click()"
da tag div.fonte
Eu estava enfrentando o mesmo problema que resolvi removendo um nome de campo que foi usado duas vezes no ajax, por exemplo
fonte
Eu sei que esse tópico é antigo, mas acho que vale a pena mencionar o cenário em que encontrei esse problema para que ele possa ajudar outras pessoas.
Suponha que você tenha elementos aninhados como este:
Você não pode manipular os eventos do elemento filho dentro do evento de seu pai porque ele se propaga para si mesmo, fazendo chamadas recursivas até que a exceção seja lançada.
Portanto, este código falhará:
Você tem duas opções para evitar isso:
fonte
Eu tive esse erro porque eu tinha duas funções JS com o mesmo nome
fonte
Se você estiver trabalhando com o Google Maps, verifique se a latência está sendo passada para
new google.maps.LatLng
o formato correto. No meu caso, eles estavam sendo passados como indefinidos.fonte
O problema no meu caso é porque eu tenho filhos roteados com o mesmo caminho do pai:
Então eu tive que remover a linha da rota das crianças
fonte
no meu caso, estou recebendo esse erro na chamada ajax e os dados que tentei passar nessa variável não foram definidos, isso está me mostrando esse erro, mas não descrevendo a variável não definida. Eu adicionei definiu que a variável n obteve valor.
fonte
Chegaram ao mesmo problema, mas não descobriram o que havia de errado e começou a culpar Babel;)
Tendo o código não retornando nenhuma exceção nos navegadores:
problema foi mal criado || (ou) parte como babel cria sua própria verificação de tipo:
então removendo
fez a transpilação de babel funcionar.
fonte
No meu caso, por engano, atribuí o mesmo nome de variável e à função val "class_routine_id"
deve ser como:
fonte
em Angular, se você estiver usando mat-select e tiver mais de 400 opções, esse erro poderá ocorrer https://github.com/angular/components/issues/12504
você precisa atualizar a versão angular / material
fonte
Estou usando o React-Native 0.61.5 junto com ( npm 6.9.0 e nó 10.16.1 )
Enquanto instalo novas bibliotecas no Project, recebi um
(por exemplo, npm install @ react-navigation / native --save)
O tamanho máximo da pilha de chamadas excedeu o erro
por isso, eu tento
sudo npm cache clean --force
(Nota: - O comando abaixo normalmente leva de 1 a 2 minutos, dependendo do tamanho do cache npm )
fonte
Às vezes, acontecia por causa do tipo de dado de conversão, por exemplo, você tem um objeto que considerou como string.
socket.id no nodejs, no cliente js, por exemplo, não é uma sequência. Para usá-lo como string, você deve adicionar a palavra String antes:
fonte
Eu estava tentando atribuir uma variável, um valor, quando essa variável não havia sido declarada.
Declarar a variável corrigiu meu erro.
fonte