es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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étodo dispatch, 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:

    async stopModal(): void {
      try {
        await this.$store.dispatch("someAction", {
          dataPopOver: "something sent",
        });
        this.closeOpenedPopOver();
      } catch (error) {
        // manejar el error aquí
      }
    },
    

    En esta versión modificada, el método stopModal se marca como async y espera a que se complete el dispatch de someAction 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:

    stopModal(): void {
      this.$store
        .dispatch("someAction", {
          dataPopOver: "something sent",
        })
        .then(() => {
          this.closeOpenedPopOver();
        })
        .catch((error) => {
          // manejar el error aquí
        });
    },
    

    En esta versión, el método dispatch devuelve una promesa que se encadena con un callback then que activa el método closeOpenedPopOver 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.

Comments are closed.