JavaScript定时执行逻辑异常:为何未按预期间隔触发事件?
问题原因分析
你的代码之所以会执行10次,核心问题是没有对当前的time值做判断——每一次setInterval的回调触发时,不管time是不是delay的倍数,都会创建一个setTimeout去执行事件。当time=10时,setInterval会从time=10循环到time=1,总共触发10次回调,自然就执行了10次事件,完全不符合你要的“仅在time为delay倍数时触发”的需求。
另外,原代码里的setTimeout逻辑也存在偏差:你设置了delay * 1000的延迟,这会导致事件在当前time对应的倒计时步骤结束后,再等delay秒才执行,而不是在time值为目标数的时刻执行,这也和你的需求不符。
修正后的代码
根据你的需求,我们需要在每次setInterval回调触发时,先判断当前time是否能被delay整除,只有满足条件时才执行事件:
let time = store.time; const run = setInterval(() => { const delay = store.delay; // 判断当前time是否是delay的倍数,满足条件才执行事件 if (time % delay === 0) { console.log("Execute event...."); } time--; // 倒计时结束时清除定时器 if (time === 0) { clearInterval(run); } }, 1000);
验证示例
- 当
time=10、delay=2时,time依次为10、8、6、4、2,这5个值都能被2整除,所以会执行5次事件,符合预期。 - 当
time=10、delay=3时,time为9、6、3时满足条件,执行3次事件,符合预期。
内容的提问来源于stack exchange,提问作者jhon estrada
相关产品推荐
相关产品推荐

