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

Ser*_*tes 4 javascript asynchronous settimeout node.js

在这里,我试图为每次迭代设置超时但我无法做到因为nodejs的性质.有没有办法做到这一点?

提前致谢

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

rsp*_*rsp 5

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

如果您想以3秒的间隔安排它们,请使用:

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

如果你想i在你的超时回调中使用,请使用let而不是var这样:

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

正如你所看到的,var它会为每一行打印1001:

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

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

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

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

(() => {
    let i = 0;
    setInterval(() => {
        i++;
        console.log('something', i);
    }, 3000);
})();
Run Code Online (Sandbox Code Playgroud)

外部闭包是为了防止i变量在外部范围内可见.或者你可以使用这样的东西:

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

在最后一个示例中,作为超时回调调用的函数每次完成时都会自行调度.

有很多方法可以做到这一点,并且都有一些优点和缺点.

例如,如果您的回调可能运行的时间超过调用之间的间隔,则不应使用setInterval.当你使用setTimeout并在每个回调中安排自己时,这不会是一个问题,但另一方面,你可能在这种间隔中的精度较低.您需要测试最适合您的方法.