Estoy usando un archivo de biblioteca JavaScript de Direct Web Remoting (DWR) y obtengo un error solo en Safari (escritorio y iPad)
Dice
Se excedió el número máximo de llamadas a la pila.
¿Qué significa exactamente este error y deja de procesarse por completo?
También cualquier solución para el Safari
navegador (en realidad en el iPad Safari
, dice
JS: la ejecución excedió el tiempo de espera
que supongo que es el mismo problema de pila de llamadas)
data
de ajax. Se corrigió el error declarando las variables.Respuestas:
Significa que en algún lugar de su código, está llamando a una función que a su vez llama a otra función y así sucesivamente, hasta que alcanza el límite de la pila de llamadas.
Esto casi siempre se debe a una función recursiva con un caso base que no se cumple.
Viendo la pila
Considera este código ...
Aquí está la pila después de un puñado de llamadas ...
Como puede ver, la pila de llamadas crece hasta alcanzar un límite: el tamaño de la pila codificada por el navegador o el agotamiento de la memoria.
Para solucionarlo, asegúrese de que su función recursiva tenga un caso base que se pueda cumplir ...
fuente
A veces puede obtener esto si accidentalmente importa / incrusta el mismo archivo JavaScript dos veces, vale la pena revisarlo en la pestaña de recursos del inspector.
fuente
En mi caso, estaba enviando elementos de entrada en lugar de sus valores:
En vez de:
Esto congeló mi pestaña de Chrome hasta un punto que ni siquiera me mostró el cuadro de diálogo 'Esperar / matar' cuando la página dejó de responder ...
fuente
Hay un bucle recursivo en algún lugar de su código (es decir, una función que eventualmente se llama una y otra vez hasta que la pila esté llena).
Otros navegadores tienen pilas más grandes (por lo que obtienes un tiempo de espera en su lugar) o se tragan el error por alguna razón (tal vez un try-catch mal colocado).
Use el depurador para verificar la pila de llamadas cuando ocurre el error.
fuente
El problema con la detección de flujos de stackover es que a veces el seguimiento de la pila se desenrollará y no podrá ver lo que realmente está sucediendo.
He encontrado algunas de las nuevas herramientas de depuración de Chrome útiles para esto.
Presiona
Performance tab
, asegúrate de queJavascript samples
estén habilitados y obtendrás algo como esto.¡Es bastante obvio dónde está el desbordamiento aquí! Si hace clic en
extendObject
podrá ver el número de línea exacto en el código.También puede ver los tiempos que pueden o no ser útiles o un arenque rojo.
Otro truco útil si realmente no puede encontrar el problema es poner muchas
console.log
declaraciones donde cree que está el problema. El paso anterior anterior puede ayudarlo con esto.En Chrome, si genera datos idénticos repetidamente, los mostrará de esta manera, mostrando dónde está el problema más claramente. En este caso, la pila alcanzó 7152 fotogramas antes de que finalmente se bloqueara:
fuente
En mi caso, estaba convirtiendo una gran matriz de bytes en una cadena usando lo siguiente:
bytes
contenía varios millones de entradas, que es demasiado grande para caber en la pila.fuente
var uintArray = new Uint16Array(bytes); var converted = []; uintArray.forEach(function(byte) {converted.push(String.fromCharCode(byte))});
En mi caso, el evento click se propagaba en el elemento hijo. Entonces, tuve que poner lo siguiente:
evento de clic:
Aquí está el código html:
fuente
Verifique los detalles del error en la consola de la barra de herramientas de desarrollo de Chrome, esto le dará las funciones en la pila de llamadas y lo guiará hacia la recurrencia que está causando el error.
fuente
Si necesita un proceso / recursión infinito ejecutándose por alguna razón, puede usar un trabajador web en un hilo separado. http://www.html5rocks.com/en/tutorials/workers/basics/
si desea manipular elementos dom y redibujar, use la animación http://creativejs.com/resources/requestanimationframe/
fuente
Casi todas las respuestas aquí indican que esto solo puede ser causado por un bucle infinito. Eso no es cierto, de lo contrario, podría sobrepasar la pila a través de llamadas profundamente anidadas (por no decir que es eficiente, pero ciertamente es posible). Si tiene control de su máquina virtual JavaScript, puede ajustar el tamaño de la pila. Por ejemplo:
node --stack-size=2000
Consulte también: ¿Cómo puedo aumentar el tamaño máximo de la pila de llamadas en Node.js?
fuente
En mi caso, dos modales jQuery se mostraban apilados uno encima del otro. Prevenir eso resolvió mi problema.
fuente
Recientemente agregamos un campo a un sitio de administración en el que estamos trabajando - contact_type ... fácil ¿verdad? Bueno, si llama al select "type" e intenta enviarlo a través de una llamada jquery ajax, falla con este error enterrado en jquery.js No haga esto:
El problema es ese tipo: tipo: creo que somos nosotros los que nombramos el argumento "tipo"; tener una variable de valor llamada tipo no es el problema. Cambiamos esto a:
Y reescribí some_function.php en consecuencia, problema resuelto.
fuente
Comprueba si tienes una función que se llame a sí misma. Por ejemplo
fuente
Esto también puede causar un
Maximum call stack size exceeded
error:Igual que aquí:
De los documentos de Mozilla :
Entonces intenta:
fuente
Ambas invocaciones del código idéntico a continuación si disminuyen en 1 funcionan en Chrome 32 en mi computadora, por ejemplo, 17905 frente a 17904. Si se ejecutan tal cual, producirán el error "RangeError: Se excedió el tamaño máximo de la pila de llamadas". Parece que este límite no está codificado sino que depende del hardware de su máquina. Parece que si se invoca como una función, este límite autoimpuesto es mayor que si se invoca como un método, es decir, este código en particular usa menos memoria cuando se invoca como una función.
Se invoca como método:
Se invoca como una función:
fuente
puede encontrar su función recursiva en el navegador crome, presione ctrl + shift + j y luego la pestaña fuente, que le brinda el flujo de compilación de código y puede encontrarlo usando el punto de interrupción en el código.
fuente
También me enfrenté a un problema similar aquí: los detalles al cargar el logotipo utilizando el cuadro desplegable de carga del logotipo
CSS.css
antes de la corrección mi código era:
El error en la consola:
Lo resolví eliminando
onclick="$('#filePhoto').click()"
de la etiqueta div.fuente
Estaba enfrentando el mismo problema, lo resolví eliminando un nombre de campo que se usó dos veces en ajax, por ejemplo
fuente
Sé que este hilo es antiguo, pero creo que vale la pena mencionar el escenario en el que encontré este problema para que pueda ayudar a otros.
Supongamos que tiene elementos anidados como este:
No puede manipular los eventos del elemento hijo dentro del evento de su padre porque se propaga a sí mismo, haciendo llamadas recursivas hasta que se lanza la excepción.
Entonces este código fallará:
Tienes dos opciones para evitar esto:
fuente
Tuve este error porque tenía dos funciones JS con el mismo nombre
fuente
Si está trabajando con google maps, compruebe si los lat lng que se están pasando
new google.maps.LatLng
tienen un formato adecuado. En mi caso, se pasaban como indefinidos.fuente
El problema en mi caso es porque tengo rutas de niños con la misma ruta con los padres:
Así que tuve que quitar la línea de la ruta de los niños.
fuente
en mi caso recibo este error en una llamada ajax y los datos que intenté pasar esa variable no se han definido, eso me muestra este error pero no describe esa variable no definida. Agregué definido que la variable n tiene valor.
fuente
Me he encontrado con el mismo problema, no podría haber descubierto lo que está mal y comenzó a culpar a Babel;)
Tener código que no devuelve ninguna excepción en los navegadores:
problema fue mal creado || (o) parte cuando babel crea su propia verificación de tipo:
así que quitando
hizo que la transpiración de babel funcionara.
fuente
En mi caso, por error, he asignado el mismo nombre de variable y a la función val "class_routine_id"
debería ser como:
fuente
en Angular, si está usando mat-select y tiene más de 400 opciones, este error puede ocurrir https://github.com/angular/components/issues/12504
tienes que actualizar la versión @ angular / material
fuente
Estoy usando React-Native 0.61.5 junto con ( npm 6.9.0 y nodo 10.16.1 )
Mientras instalo cualquier biblioteca nueva en Project, obtuve una de
(por ejemplo, npm install @ react-navigation / native --save)
Error de tamaño de pila de llamadas máximo excedido
por eso lo intento
sudo npm cache clean --force
(Nota: - El siguiente comando generalmente demora de 1 a 2 minutos, dependiendo del tamaño de su caché npm )
fuente
A veces sucedió debido al tipo de datos de conversión, por ejemplo, tiene un objeto que consideró como cadena.
socket.id en nodejs, ya sea en el cliente js como ejemplo, no es una cadena. Para usarlo como cadena, debe agregar la palabra Cadena antes:
fuente
Estaba tratando de asignar una variable, un valor, cuando esa variable no se había declarado.
Declarar la variable corrigió mi error.
fuente