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

如何让JavaScript游戏循环的延迟时间随每次迭代缩短?

问题分析与修复方案

你这段代码的问题在于同步的while循环会一次性创建所有定时器,这些定时器的延迟都是从start函数执行的那一刻开始算的,而不是等前一个定时器跑完再启动下一个。

举个例子:当i=1000时,你设了个5000ms后触发的定时器;紧接着i=900,又设了个4500ms后触发的——后者反而比前者早500ms执行。到最后,所有定时器的触发时间是0.5s、1s、1.5s…5s,间隔全是500ms,自然10次5秒就跑完了,完全不是你想要的“间隔逐渐缩短”的效果。

修复后的代码

用递归调用就能实现真正的“上一次触发完成后,再设下一个更短的间隔”:

const begin = document.getElementById("startbtn");
begin.onclick = start;

function start() {
    console.log("test");
    let interval = 1000; // 初始间隔(毫秒)
    const step = 100;     // 每次缩短的幅度

    function loop() {
        console.log("adsafsd");
        interval -= step;
        // 间隔还大于0就继续
        if (interval > 0) {
            setTimeout(loop, interval);
        }
    }

    // 启动第一次循环
    setTimeout(loop, interval);
}

额外说明

  • 如果要保留你原代码里“延迟乘以5”的逻辑,把setTimeout(loop, interval)改成setTimeout(loop, interval * 5)就行
  • 这种递归方式是游戏循环里常用的“帧调度”思路,确保每次循环都在前一次完成后启动,间隔控制更准确

内容的提问来源于stack exchange,提问作者ThisNameTagPasses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:52:32