Tener problemas con mangosta promete resolver tiempos con Discord.js. Actualmente tengo una función asíncrona para buscar un usuario determinado y otra para agregar un usuario determinado. Sé que la búsqueda da el objeto de usuario adecuado. la primera promesa devuelta no está resolviendo el campo _points y pasa a través de 'indefinido' inmediatamente al siguiente bloque.
Intenté asegurarme de que ambos devolvieron promesas y cambiaron la función findUser, pero nada parece haberse atascado. ¿Algún consejo sobre cómo hacer que esta cadena de promesas funcione?
Activación por comando:
try { await addUser(userId, userName, guildId, guildName, createdTimeStamp, points) .then(() => { return new Promise((res, rej) => { const _points = findUser(userId, guildId)["points"]; res(_points); }); }) .then((response) => { return new Promise((res) => { console.log(response); interaction.editReply({ content: `Current Points: ${response}`, ephemeral: true }); res('finished'); }); }); } catch (e) { console.log(`error creating member ${e}`); }Funciones de la mangosta:
const findUser = async (userId, guildId) => { const member = await EngagementTracking.findOne({ userId: `${userId}`, guildId: `${guildId}` }).exec(); return await member; }; const addUser = async (userId, userName, guildId, guildName, createdTimeStamp, points) => { if (findUser(userId, guildId) !== null) return new Promise((res, rej) => { res("duplicate member"); }); const member = { userId: `${userId}`, userName: `${userName}`, guildId: `${guildId}`, guildName: `${guildName}`, createdTimestamp: `${createdTimeStamp}`, points: points } return await EngagementTracking.create(member).exec(); };@BGPHiJACK tenía razón y me envió por la madriguera del conejo de encontrar qué promesas se estaban ejecutando y cuándo. Se modificó la cadena de promesas para garantizar una ejecución adecuada. Para la posteridad y cualquiera que tenga un problema similar:
await addUser(userId, userName, guildId, guildName, createdTimeStamp, points) .then((response) => { if (response[1]) { return new Promise((res) => { interaction.editReply({ content: `Current Points: ${response[0]["points"]}`, ephemeral: true }); res(response[0]); }); } else { return new Promise((res) => { interaction.editReply({ content: `Now Tracking. Current Points: ${response["points"]}`, ephemeral: true }); res(response); }); } });Y las funciones DB:
const findUser = async (userId, guildId) => { const member = await EngagementTracking.findOne({ userId: `${userId}`, guildId: `${guildId}` }).exec(); return member; }; const addUser = async (userId, userName, guildId, guildName, createdTimeStamp, points) => { const userPromise = new Promise((res) => { res(findUser(userId, guildId)); }); return userPromise.then((response) => { if (response !== null) { return new Promise((res) => { res([response, "duplicate"]); }); } else { const member = { userId: `${userId}`, userName: `${userName}`, guildId: `${guildId}`, guildName: `${guildName}`, createdTimestamp: `${createdTimeStamp}`, points: points }; return EngagementTracking.create(member); } }); };