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:
InputTimeout desde la primera solicitud y la segunda solicitudLo que deseo que suceda es:
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(); }); }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!
.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(); }