所以,我在函数和使用间隔通过它们传递变量方面遇到了一些问题。虽然我可以传递值,但我似乎无法更新它们。
主要功能如下:
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 行,我将把它链接到粘贴箱:
最佳答案
事实上,您应该使用 =
分配属性值,而不是分配新对象。
如果您的引擎支持,您可以使用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/