无法在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); })();
外部闭包是为了让i
variables在外部范围内可见。 或者你可以使用这样的东西:
(() => { 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)