Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

182
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!