循环内部的.setTimeout()来更新数据(mongoDB)



我正试图使;Bee";当能量变为0时睡眠5秒,然后它会恢复所有的统计数据。然而,在命令执行后,它的统计数据变为0,但在5秒钟后,它不会恢复统计数据。知道怎么修吗?

// some codes above (unrelated)
Hive.findOne({ User: message.author.id }, async (err, data) => {
// some codes here (unrelated)
const arr = [];
const en = Object.keys(data.Hives).map((key) => {
return data.Hives[key].Energy
})
for (let a = 1; a < en.length + 1; a++) {
if (!isNaN(data.Hives[`Hive${a}`].Energy)) {
data.Hives[`Hive${a}`].Energy -= 1
if (data.Hives[`Hive${a}`].Energy < 1) {
arr.push(`😴 Your ${data.Hives[`Hive${a}`].Bee} is out of energy! It's going to sleep.`);
data.Hives[`Hive${a}`].Gathers = 0;
data.Hives[`Hive${a}`].Converts = 0;
// --- where the problem begins ---
setTimeout(async() => {
data.Hives[`Hive${a}`].Energy = data.Hives[`Hive${a}`].MaxEnergy;
data.Hives[`Hive${a}`].Gathers = 2.5 * (1 + 0.1 * (data.Hives[`Hive${a}`].Level - 1));
data.Hives[`Hive${a}`].Converts = (80 * (1 + 0.1 * (2 - 1)) * statsProfile.ConvertRate) / 100;
}, 5000);
// --- where the problem ends ---
};
};
};
if (arr.length != 0) {
message.reply({
embeds: [
new Discord.MessageEmbed()
.setTitle("Out of energy...")
.setDescription(arr.join(`n`))
.setColor("ffbe42"),
],
});
}
//some codes here as well (unrelated)
await Hive.findOneAndUpdate(user, data);
});

我试着把await data.save()放在.setTimeout()内部和之前

setTimeout仅用于延迟命令的执行。使用setInterval而不是setTimeout。然后使用另一个函数每5秒循环一次。

以下是我如何处理循环函数:

function loop() { //added the function for looping
Hive.findOne({ User: message.author.id }, async (err, data) => {
// some codes here (unrelated)
const arr = [];
const en = Object.keys(data.Hives).map((key) => {
return data.Hives[key].Energy
})
for (let a = 1; a < en.length + 1; a++) {
if (!isNaN(data.Hives[`Hive${a}`].Energy)) {
data.Hives[`Hive${a}`].Energy -= 1
if (data.Hives[`Hive${a}`].Energy < 1) {
arr.push(`😴 Your ${data.Hives[`Hive${a}`].Bee} is out of energy! It's going to sleep.`);
data.Hives[`Hive${a}`].Gathers = 0;
data.Hives[`Hive${a}`].Converts = 0;
// --- where the problem begins ---
/*setTimeout(async() => {
data.Hives[`Hive${a}`].Energy = data.Hives[`Hive${a}`].MaxEnergy;
data.Hives[`Hive${a}`].Gathers = 2.5 * (1 + 0.1 * (data.Hives[`Hive${a}`].Level - 1));
data.Hives[`Hive${a}`].Converts = (80 * (1 + 0.1 * (2 - 1)) * statsProfile.ConvertRate) / 100;
}, 5000);*/
// --- where the problem ends ---
};
};
};
if (arr.length != 0) {
message.reply({
embeds: [
new Discord.MessageEmbed()
.setTitle("Out of energy...")
.setDescription(arr.join(`n`))
.setColor("ffbe42"),
],
});
}
//some codes here as well (unrelated)
await Hive.findOneAndUpdate(user, data);
});
}
/* Here's when calling the function */
setInterval(() => {
loop();
}, 5000)

我对setTimeout进行了注释,这样在执行命令时就不会有延迟,所以每隔5秒就会执行loop()函数。

最新更新