为什么我的 setTimeout 函数没有等待指定的时间?

Why is my setTimeout function not waiting for the time specified?

我有一个 for 循环,我想在延迟后打印它的第 i 个值,但是使用 setTimeout() 函数,它会等待指定的时间,然后 i 的每个值都会立即打印出来。这是因为 setTimeout() 是一个异步函数,当它完成第一次倒计时时,所有其他值的时间也结束了。

for(let i=0;i<10;i++){
   setTimeout(()=>{
     console.log(i);
   },10);
}

输出: (10 毫秒间隔)1-2-3-4-5

需要输出:1 - 10ms 间隙 - 2 -10ms 间隙--...等等。请提供解决原因。

您可以为每个项目修改循环中的计时器。

for(let i=0;i<10;i++){
   setTimeout(()=>{
     console.log(i);
   },10*(i+1));
}

这样可以确保每个项目之间有适当的间隙。

希望对您有所帮助。

你在你的循环中重复调用 setTimeout(),如果你只是想延迟你的循环,你可以尝试这样的事情。

loopWithDelay();

async function loopWithDelay() {
    for(let i = 0; i < 10; i++){
        console.log(i)
        await delay(100);
    }
}

var timer;
function delay(ms) {
    return new Promise((x) => {
        timer = setTimeout(x, ms);
    });
}

是的,setTimeout() 是一个异步函数,所有倒计时几乎都在准确的时间开始,因为连续的 setTimeout() 调用之间没有等待时间。

为了获得预期的行为,您可以将 for 放入函数中,并在倒计时结束时从 setTimeout() 调用该函数:

function f(i) {
    if(i < 10) {
        setTimeout(()=> {
            console.log(i);
            f(i+1);
        }, 10);
     }
}
f(0);

你是正确的 setTimeout 是异步的,因此每个 console.log(i) 基本上同时设置为 运行。我发现在您的场景中使用 setInterval 更容易:

let i = 0;
let myInterval = setInterval(() => {
    console.log(i);
    i++;

    if (i === 10) {
        clearInterval(myInterval);
    }
}, 10);