如何控制通过函数传递的变量?

时间:2018-04-13 01:40:56

标签: 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行,我将把它链接到粘贴bin:

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

辅助汽车:https://pastebin.com/5xcG1qyx

1 个答案:

答案 0 :(得分:1)

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

如果引擎支持,您可以使用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