函数setTimeout在循环中



如果我在循环中使用setTimeout,那么只有在循环结束后,它才会同时执行所有操作。正如许多文章所建议的那样,我试图将setTimeout放在一个单独的函数中,但它没有帮助。代码很简单:

function foo(i)
{
setTimeout( function() {console.log(i);}, 2000);
}
for (let i=0; i<5; i++)
{
foo(i);
}

它打印01.2.3.4.一次性

这是因为进程注册表几乎同时使用5 setTimeout。

尝试使用不同的超时时间,如下所示:

function foo(i)
{
setTimeout( function() {console.log(i);}, 1000 * i);
}
for (let i=0; i<5; i++)
{
foo(i);
}

您也可以使用生成器来完成此操作。生成器可以在函数执行到一半时暂停https://www.javascripttutorial.net/es6/javascript-generators/

function* generator() {
let index = 1;
while (index <= 5) {
yield index++;
}
}
let f = generator();

var interval = window.setInterval(function(){
const obj = f.next();
if (obj.done){
clearInterval(interval);
} else {
console.log(obj.value)
}
}, 1000);

最新更新