You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:10:32