无法在Node.js循环中设置超时

在这里,我试图设置每个迭代超时,但我不能让它因为nodejs的性质。 有没有办法做到这一点?

提前致谢

for (var i = 1; i <= 1000; i++) { setTimeout(function () { console.log('something') }, 3000); } 

它可以工作,但它同时安排所有超时。

如果您想要以3秒为间隔进行排定,请使用:

 for (var i = 1; i <= 1000; i++) { setTimeout(function () { console.log('something') }, i * 3000); } 

如果你想在你的超时callback中使用i ,使用let而不是像这样var

 for (let i = 1; i <= 1000; i++) { setTimeout(function () { console.log('something', i) }, i * 3000); } 

正如你可以看到var它会打印1001的每一行:

 for (var i = 1; i <= 1000; i++) { setTimeout(function () { console.log('something', i) }, i * 3000); } 

顺便说一句,你可以用箭头函数语法简化它:

 for (let i = 1; i <= 1000; i++) { setTimeout(() => console.log('something', i), i * 3000); } 

另一种方法是做这样的事情 – 而不是同时安排所有1000个超时,创build一个时间间隔:

 (() => { let i = 0; setInterval(() => { i++; console.log('something', i); }, 3000); })(); 

外部闭包是为了让ivariables在外部范围内可见。 或者你可以使用这样的东西:

 (() => { let i = 0; let f = () => { i++; console.log('something', i); setTimeout(f, 3000); }; setTimeout(f, 3000); })(); 

在最后一个例子中,被调用为超时callback的函数每次完成时都会调度它自己。

有很多方法可以做到,都有一些优点和缺点。

例如,如果callback的运行时间可能比调用之间的时间间隔长,则不应使用setInterval。 当您使用setTimeout并在每个callback中调度自己时,这不会成为问题,但另一方面,您可能在这种间隔中的精确度会降低。 你需要testing什么最适合你。

 for (var i = 1; i <= 10; i++) { wait('something', i, 10); } function wait(msg, i, length){ setTimeout(function () { console.log(msg) ; }, (i * 3000)); } 

我认为你真正想要的是setInterval 。

 let runMeEveryThreeSeconds = function() { console.log('hello!') } let threeSecondTimer = setInterval(runMeEveryThreeSeconds, 3000) 

计时器将永远运行,每三秒钟一个字“hello!” 将被打印到您的控制台。 当您准备取消定时器时,您将需要:

 clearInterval(threeSecondTimer)