Obteniendo el error “Uncaught RangeError: tamaño de pila máxima excedido” al intentar cerrar un popover en IONIC+VUE (con vuex)
Buenos días desarrolladores. Estoy trabajando en esta aplicación IONIC + VUE, específicamente en un popover con algunas funcionalidades, pero por alguna razón el popover tiene un comportamiento extraño, porque una vez que está abierto y hago clic para cerrarlo, la primera vez el modal aún persiste y arroja este error:
Error de rango sin controlar: Tamaño máximo de la pila de llamadas sobrepasado
en Object.ownKeys
en hasBinary (is-binary.js:48)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
en hasBinary (is-binary.js:49)
Luego, en el segundo clic, se cierra.
Déjenme darles un poco de contexto sobre lo que hice.
Aquí se encuentra la plantilla con el botón que desencadena un método en vuex que realiza algunas tareas, y también se ha incluido el método que cierra el modal (closeOpenedPopOver()
).
NOTA: Si no coloco la acción del despachador en vuex, el modal se cierra correctamente.
<ion-content>
<ion-row>
<ion-col size="6"></ion-col>
<ion-button @click="stopModal()">
Stop
</ion-button>
</ion-row>
</ion-content>
Método:
methods: {
...mapActions(["someAction"]),
stopModal(): void {
this.$store.dispatch("someAction", {
dataPopOver: 'algo enviado',
});
this.closeOpenedPopOver();
},
closeOpenedPopOver(): void {
popoverController.dismiss();
},
},
VUEX:
someAction({ dispatch }, payload) {
commit("");
dispatch("otherAction");
socket.emit("something", payload);
},
otherAction({ state, commit }) {
// ...haciendo otras cosas...
},
¿Alguna idea de por qué está sucediendo esto?
Gracias de antemano y Feliz Año Nuevo 2022.
davy.ai
Según el mensaje de error proporcionado, parece que se está produciendo una llamada de función recursiva que hace que la pila de llamadas supere su límite. El mensaje de error menciona específicamente la función
hasBinary
, que podría ser una biblioteca de terceros o una función definida en otro lugar del código que se llama repetidamente.Una posible explicación para el problema es que el método
stopModal
está provocando múltiples actualizaciones del estado a través del métododispatch
, lo que a su vez provoca que el componente se vuelva a renderizar varias veces, lo que podría llevar a un bucle recursivo.Para solucionar esto, podrías intentar modificar el código para que solo se envíe la acción una vez y esperar a que se complete antes de activar el método de cierre del modal. Esto se puede lograr utilizando async/await o cadenas de promesas.
Por ejemplo:
En esta versión modificada, el método
stopModal
se marca comoasync
y espera a que se complete eldispatch
desomeAction
antes de cerrar el popover. Esto debería asegurar que las actualizaciones del estado y cualquier lógica de renderización asociada se completen antes de que se descarte el modal, evitando así el bucle recursivo.Alternativamente, podrías utilizar cadenas de promesas para lograr el mismo resultado:
En esta versión, el método
dispatch
devuelve una promesa que se encadena con un callbackthen
que activa el métodocloseOpenedPopOver
solo después de que la promesa se complete correctamente.En general, la idea clave es asegurarse de que las actualizaciones del estado desencadenadas por el método
dispatch
se completen por completo antes de activar el método de cierre del modal, para evitar posibles bucles recursivos u otros problemas.