Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

184
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda