在从嵌套承诺链内部的猫鼬传递用户数据时遇到问题



使用mongose promise解决Discord.js的问题。我目前有一个异步函数来获取给定的用户,还有一个函数来添加给定的用户。我知道fetch提供了正确的用户对象。第一个返回的promise没有解析_points字段,而是通过'undefined'立即传递到下一个块。

我试着确保这两个都返回了promise,并围绕findUser函数进行了更改,但似乎没有什么问题。关于如何让这个承诺链发挥作用,有什么建议吗?

命令激活:

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}`);
}

Mongoose函数:

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是对的,让我陷入了寻找哪些承诺何时执行的兔子洞。更改了承诺链以确保正确执行。对于子孙后代和任何遇到类似问题的人:

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);
});
}
});

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);
}
});
};

相关内容

最新更新