Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

180
Vistas
La promesa recursiva de Javascript está disparando catch() dos veces, teniendo dificultades para seguir

Escribí una función en Discord.js v13 que espera la entrada del usuario. Si la entrada no es válida, debe volver a solicitarlos y ya no se debe considerar la promesa original.

Si el usuario tarda más de timeoutSeconds , arroja un error de InputTimeout .

Lo que sucede en la práctica, que no entiendo, es esto:

  1. se ejecuta getResponse(...)
  2. Se le solicita al usuario que ingrese
  3. El usuario proporciona una entrada no válida
  4. Se informa al usuario de una entrada no válida y se le vuelve a solicitar
  5. Si no se proporciona ninguna entrada, se genera un error InputTimeout desde la primera solicitud y la segunda solicitud

Lo que deseo que suceda es:

  1. se ejecuta getResponse(...)
  2. Se le solicita al usuario que ingrese
  3. El usuario proporciona una entrada no válida
  4. Se informa al usuario de una entrada no válida y se le vuelve a solicitar
  5. Si no se proporciona ninguna entrada, se genera un error InputTimeout solo para la nueva solicitud

Esto es lo que creo que está sucediendo... El segundo indicador arroja el error InputTimeout , lo que hace que se active el controlador catch() de la primera Promesa. Si eso es cierto, entonces estoy confundido, porque pensé que si se ejecuta then() , entonces es porque no se arrojó ningún error. Entonces, ¿por qué catch() detecta errores de la función then() ? ¿Debería poner catch() primero, antes de then() ? ¿Es esto un problema con el orden en que he encadenado las funciones?

 async getResponse(user, timeoutSeconds, channel = null) { if (channel == null) { const msg = await user.send(this.promptMessage); channel = msg.channel; } return await channel .awaitMessages({ max: 1, time: timeoutSeconds * 1000, errors: ["time"], }) .then(async (messages) => { if (messages.size == 1) { const message = messages.values().next().value; if (this.validator(message)) { await user.send(this.successMessage); return this.formatter(message); } else { await user.send(this.errorMessage); await this.getResponse( user, timeoutSeconds, channel ); } } }) .catch(async (e) => { console.error(e); await channel.send(this.timeoutMessage); throw new InputTimeout(); }); }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El problema era, de hecho, el orden de .then() y .catch() . Como solo me preocupaba detectar errores de la función awaitMessages() , debería haberlo encadenado primero, seguido de .then() .

Al poner catch() después de then() , estaba detectando errores de mi función then() .

¡Do!

Nueva solución, que también elimina .then() y .catch() según lo sugerido por la comunidad:
 try { let messages = await channel.awaitMessages({ max: 1, time: timeoutSeconds * 1000, errors: ["time"], }); messages = Array.from(messages.values()); if (messages.length == 1) { const message = messages[0]; if (message.author.bot) return; if (this.validator(message)) { await user.send(this.successMessage); return this.formatter(message); } else { await user.send(this.errorMessage); return this.getResponse( // note I removed "await" here to prevent nested errors user, timeoutSeconds, channel ); } } } catch (e) { console.error(e); await channel.send(this.timeoutMessage); throw new InputTimeout(); }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda