javascript - 如何控制函数中传递的变量?

标签 javascript node.js

所以,我在函数和使用间隔通过它们传递变量方面遇到了一些问题。虽然我可以传递值,但我似乎无法更新它们。

主要功能如下:

    tradeSkill: (msg, what, type, amount, userData, stats) => {
     stats.actions--;
  if (stats.actions <= 0) {

        // The report DM
        userData.send({ embed: {
          color: 3447003,
          title: `Farming Report For ${type}`,
          fields: [{
            name: 'Stats',
            value:
            'Gathered: ' + stats.yield +
            '\nEXP Gained: ' + stats.exp,
          },
        ],
        },
        });

        //Reset stats for Report
        stats = {
          exp: 0,
          actions: amount,
          yield: 0,
        };

      }
    }

以下是我传递它的方式:

autos(msg, what, type, amount, userData, stats);

这是自动功能:

function autos(msg, what, type, amount, userData, stats) {
        if (userData.interval === undefined || userData.interval === false) {
          userData.interval = setInterval(() => {
            skills.tradeSkill(msg, what, type, amount, userData, stats);
            userData.intervalTime = Date.now();
          }, 6000);
          skills.tradeSkill(msg, what, type, amount, userData, stats);
        } else {
          var timing = userData.intervalTime + 5900 - Date.now();
          if (timing < 0) {
            timing = 0;
          }

          // Waits for current to end, then updates it.
          setTimeout(() => {
            clearInterval(userData.interval);
            userData.interval = setInterval(() => {
              skills.tradeSkill(msg, what, type, amount, userData, stats);
              userData.intervalTime = Date.now();
            }, 6000);
            skills.tradeSkill(msg, what, type, amount, userData, stats);
          }, timing);
        }
      }

我的问题: 在第一个函数中,当stats.actions等于或小于0时​​,它将发送一条DM(使用discord.js,但这不是discord.js问题,所以不用担心) 。然后将其重置回指定的金额(始终 > 0)。然而,当它达到 0 后,它会继续发送 DM,并且不会将其设置为应该正确的值。如果我在 if 语句之前及其内部执行 console.log(stats.actions) ,它总是在 if 语句之前生成 0,并且在 if 语句内部始终生成 10(当它触发第一次)

如果没有完整的代码可能很难理解,但是由于它总共接近 1k 行,我将把它链接到粘贴箱:

主要功能:https://pastebin.com/XmmRqgsT

中学汽车:https://pastebin.com/5xcG1qyx

最佳答案

事实上,您应该使用 = 分配属性值,而不是分配新对象。

如果您的引擎支持,您可以使用Object.assign()而不是=。它会生成浅复制(而不是深复制),这对您有用,因为您的对象是平面的。

我简化了您的示例以使其在这里工作:

const stats = {
    exp: 0,
    actions: 2,
    yield: 0
};
const skills = {
    tradeSkill: (amount, stats) => {
        stats.actions--;
        if (stats.actions <= 0) {
            //Reset stats for Report
            Object.assign(stats, { // properties of 2nd object are copied into 1st object
                exp: 0,
                actions: amount,
                yield: 0
            });
        }
        return stats;
    }
}
console.log(skills.tradeSkill(10, stats)); // { exp: 0, actions: 1, yield: 0 }
console.log(skills.tradeSkill(10, stats)); // { exp: 0, actions: 10, yield: 0 }
console.log(skills.tradeSkill(10, stats)); // { exp: 0, actions: 9, yield: 0 }

要了解差异,您可以查看this answer .

关于javascript - 如何控制函数中传递的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49808106/

相关文章:

javascript - 将日期从 JSON 格式化为 Datepicker 字段

javascript - 获取段落对齐值

javascript - 试图从按键文档中获取数字,javascript

Node.js sequelize 关联包括

node.js - 关于 sequelize 迁移的快速问题

javascript - 在参数中使用解构时未捕获类型错误

javascript - 奇怪的 Gecko 行为(试图在 js 模块之间传递一个 nsiDomWindows 数组)

node.js - Koa.js 等待执行完成

node.js - Node JS Soap 请求中的身份验证

Node.js/Mongodb 插入回调返回未定义