Quiero asegurarme de que la base de datos se abra correctamente, luego ejecutar la instrucción get y luego enviarla. Pero soy el siguiente en la consola donde se ejecuta simultáneamente. ¡Gracias por adelantado!
Registro de la consola:
here1 here2 usergp is undefined usergp in get is 10931Salida deseada:
here1 usergp in get is 10931 here2 usergp is 10931Código:
let selectGP = 'select gp from Money where userID = ? and guildID = ?'; let userGP; let db; const openDB = new Promise(resolve => { db = new sqlite3.Database('./Toothless.db', (err) => { if (err) { console.error(err.message); } }); resolve(); }); x = openDB.then(() => { console.log('here1'); db.get(selectGP, [interactionUserID, interactionGuildID], (err, row) => { if (err) { console.log('in test > select GP'); } else { userGP = row.gp; console.log('usergp in get is ' + userGP); return userGP; } }); }).then((data) => { console.log('here2'); console.log('usergp is '+ data); interaction.reply({ content: 'you have ' + data , ephemeral: true }); db.close(); }).catch(() => { console.log('in catch'); });no está devolviendo ningún valor del primer paso de la cadena de promesa, por lo que la rompe, por lo que los data en el siguiente paso siempre permanecerán vacíos.
¿ db.get devuelve una promesa? si es así, puede devolver eso (o declarar el primer paso como una función async , y devolver el valor esperado, es decir, return await db.get(...) . como se menciona en los comentarios, async / await no es el punto aquí, es solo otra forma de expresar el flujo asíncrono anidado que está buscando)
en cualquier caso, también debe omitir la devolución de llamada db.get y mover esa lógica then la devolución de llamada.
sería una buena idea arrojar cualquier error de la base de datos (después de iniciar sesión o lo que sea), para que sea capturado por el último paso catch()
si su objetivo es cambiar el orden de ejecución, y db.get no proporciona promesas con las que trabajar, puede envolverlo usted mismo con una promesa (tedioso), o usar una biblioteca de ayuda para tales flujos, como async , que también Tiene utilidades para este tipo de envolturas (fácil).