【问题标题】:JavaScript sleep function sequence?JavaScript 睡眠函数序列?
【发布时间】:2021-12-30 00:29:37
【问题描述】:

我正在用 JavaScript 制作一个不和谐的机器人。当玩家工作机器人时,我想打发cooltime。

首先,我设置了等待功能。

function sleep(ms) {
    return new Promise((r) => setTimeout(r, ms));
}

还有,

if (mine_cooltime === 0) {
    mine_cooltime = 1;

    const msgRef = await message.reply({embeds: [embed_mine_stone]}); // Don't care this

    sleep(user.mine_time)
    .then(() => msgRef.edit({embeds: [embed_mine_stone_end]})) // Don't care this
    .then(() => saveUser = {id, name, wood : user.wood, stone : user.stone + 3, iron : user.iron, coal : user.coal, gold : user.gold, diamond : user.diamond,
        findWood : user.findWood, findStone : 1, findironOre : user.findironOre, findCoal : user.findCoal, findGold : user.findGold, findDiamond : user.findDiamond, user.mine_time : user.mine_time
        })
    .then(() => fs.writeFileSync(filePath, JSON.stringify(saveUser)))
    .then(() => mine_cooltime = 0);
}

这是一个挖掘石头的代码。

if (wood_cooltime === 0) {
    wood_cooltime = 1;

    const msgRef = await message.reply({embeds: [embed_wood_cut]}); // Don't care this
    sleep(user.wood_time)
    .then(() => msgRef.edit({embeds: [embed_wood_cut_end]})) // Don't care this
    .then(() => saveUser = {id, name, wood : user.wood + 5, stone : user.stone, iron : user.iron, coal : user.coal, gold : user.gold, diamond : user.diamond,
        findWood : 1, findStone : user.findStone, findironOre : user.findironOre, findCoal : user.findCoal, findGold : user.findGold, findDiamond : user.findDiamond, user.mine_time : user.mine_time
        })
    .then(() => fs.writeFileSync(filePath, JSON.stringify(saveUser)))
    .then(() => wood_cooltime = 0);
}

这是一个砍伐森林的代码。

“mine_time”和“wood_time”都是 5000。

如果我在操作切割代码后3秒操作采矿代码,在采矿代码完成后的最初2秒,“木头”增加。但是当挖矿代码完成时,“木”是一样的,只是“石头”增加了。

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 您使用来自user 的值更新saveUser 并将saveUser 写入文件,但是您是否更新了user?如果您没有更新 user,那么每当您尝试更新 saveUser 时,都会重复使用最旧的值。
  • 旁注:将每一行都放在单独的 then 块中是多余的。如果then 块中要完成的任务不是异步的,只需在一个then 块中完成所有这些任务。或者干脆使用 async/await

标签: javascript node.js discord.js


【解决方案1】:

发生这种情况是因为您将修改后的用户对象分配给saveUser,这意味着user 仍然具有旧值。因此,如果几秒钟后其他代码也创建了一个修改后的对象,它将从原始对象进行修改,而不是从修改后的版本。

我建议忘记saveUser 变量,只分配给user,并在JSON.stringify 中使用它。

也许您需要用户对象是不可变的,但如果这不是必需的,您甚至不需要使用对象字面量创建一个全新的对象。相反,您可以使用user.wood += 5user.stone += 3 改变现有对象。但同样,这会改变用户对象,这可能不适用于您的状态管理框架。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2017-10-12
    • 2017-01-02
    • 2010-12-12
    • 2014-12-13
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多