2015-10-05 89 views
-2

我试图在for循环中运行setTimeout。我已经按照建议将setTimeout移动到一个单独的函数中。然而,在循环结束时,一切似乎都立即开始。setTimeout for循环一次全部触发

在这个例子中,我希望console.logs每秒触发一次。

function setDelay(i) { 
    setTimeout(function(){ 
     console.log(i); 
    }, 1000); 
} 

for (var i = 1; i <= 10; ++i) { 
    setDelay(i); 
} 
+0

我对输出真的很好奇,我猜''我'变量保留的价值,因为它在不同的功能?如果是循环变量,它肯定会输出10次。 – TJHeuvel

+0

我只是很好奇:你为什么要问一个问题,甚至不想回答人们的意见和答案? – sbedulin

回答

0

你的代码的问题是它会创建10个超时,在1秒后或多或少同时发生。

如果您希望每秒执行一次(或任何其他频率),则可以使用setInterval。

0

实现这一目标最简单的方法是通过指数乘以超时:

function setDelay(i) { 
    setTimeout(function(){ 
     console.log(i); 
    }, i * 1000); 
} 
0

有一个在你的循环没有延迟,让你真正想要的是在1000毫秒第一次和2000毫秒的设置间隔秒等

function setDelay(i) { 
    setTimeout(function(){ 
     console.log(i); 
    }, 1000 * i); 
} 

for (var i = 1; i <= 10; ++i) { 
    setDelay(i); 
} 

这可以很容易地通过乘以你的索引变量的时间来实现。

0

您可以更好地使用setInterval()而不是setTimeout()。使用clearInterval()可以阻止它运行。你所做的代码不起作用,因为for循环本身没有范围。您可以使用setInterval()来解决for循环。

0

你也可以这样做:

(function updateEverySecond(){ 
    console.log(1); 
    setTimeout(updateEverySecond, 1000); 
})(); 
0

到计数器采用setInterval和参考可能是你更好的解决方案。

(function(){ 
 
    var count  = 0, 
 
     upperBound = 3, 
 
     intervalTime = 1000, 
 
     interval  = setInterval(function(){ 
 
     if (count === upperBound) { 
 
     clearInterval(interval); 
 
     } else { 
 
      console.log(count); 
 
      count++; 
 
     } 
 
     }, intervalTime); 
 
}());

希望帮助你!