JS中setTimeout无法递减数组内对象mzone属性值问题求助
问题原因
- 核心问题:
setTimeout(function(){ (clubsList[playerCountry].mzone - 1 ) }, 5000);这段代码仅计算了mzone - 1的结果,没有将结果赋值回mzone属性,计算得到的临时值没有被保存,因此原属性不会发生变化。 - 潜在问题:你使用数组
clubsList存储以playerCountry(字符串类型)为键的对象,属于数组类型误用,JS数组的原生方法仅对数字索引生效,此处改用普通对象更符合使用场景。
修复代码
// 把clubsList从数组改为普通对象更合理 const clubsList = {} onNet('verifyMeetingZone', (playerCountry) => { if (!clubsList[playerCountry]) { clubsList[playerCountry] = { mzone: 0 } } if (clubsList[playerCountry].mzone <= 2) { console.log("Mzone Criado") clubsList[playerCountry].mzone += 1; console.log(clubsList[playerCountry].mzone) // 修改点:将减法结果赋值回原属性,新增边界判断避免减到负数 setTimeout(function(){ if(clubsList[playerCountry]?.mzone > 0) { clubsList[playerCountry].mzone -= 1 } }, 5000); setTimeout(function(){ console.log(clubsList[playerCountry].mzone) }, 6000); } else { console.log("Ja existe") } })
补充说明
如果业务场景中存在5秒内多次触发verifyMeetingZone事件的情况,每个触发都会新增一个独立的定时器,各自在5秒后执行减1操作,完全符合你「本次新增的1会在5秒后自动扣减」的需求,无需额外处理。如果你的实际需求是最后一次触发后统一5秒再扣减,可额外存储定时器ID,每次触发前先清理上一次的定时器即可。
内容的提问来源于stack exchange,提问作者Hugo Almeida
相关产品推荐
相关产品推荐

