所以,我遇到了一些函数问题,并使用一个区间通过它们传递变量。虽然我可以通过我可以获得值,但似乎可以让它们更新。
这是主要功能:
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:
答案 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。