setTimeout在循环表达式中只发生一次

时间:2015-07-09 06:27:58

标签: javascript loops

这是一个例子:

function func1()
{
   setTimeout(function(){doSomething();}, 3000);
}
for(i=0;i<10;i++)
{
   func1();
}

执行后,延迟只发生在第一个循环中,但它并没有发生在其余的循环中,因为&#39;表达。

我希望延迟发生在所有循环中,而不仅仅是在第一次。
我的代码有什么问题?

7 个答案:

答案 0 :(得分:7)

您正在安排10个电话,但问题是所有人都在同一时间安排,即3秒后。

如果你想逐步调用它们,那么你需要增加每次通话的延迟。

解决方案是将延迟单位值传递给func1

function func1(i) {
  setTimeout(function() {
    doSomething();
  }, i * 500);//reduced delay for testing
}
for (i = 0; i < 10; i++) {
  func1(i + 1);
}

var counter = 0;

function doSomething() {
  snippet.log('called: ' + ++counter)
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<!-- To show result in the dom instead of console, only to be used in the snippet not in production -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 1 :(得分:4)

循环将安排10次超时全部在3秒后完成。您可以使用setTimeout

进行递归
function loopAsync(delay, n, f) {
  setTimeout(function() {
    if (n > 0) {
      f()
      loopAsync(delay, n - 1, f)
    }
  }, delay)
}

loopAsync(3000, 10, doSomething)

答案 2 :(得分:2)

什么是你正在调用10次(没有延迟)func1()然后你所拥有的是10个函数同时,解决方案很简单,使用setInterval,这里是{{3} }

答案 3 :(得分:1)

使用async.js

async.timesSeries(5, function (n, next) {
    setTimeout(function(){
        doSomething();
        next();
    }, 3000);
});

答案 4 :(得分:1)

如果你想要不断延迟迭代,恕我直言,你最好使用setInterval

var loops = 9,
    intervalId = setInterval(function () {
        // My super code goes here
        console.log(loops);
        loops-- <= 0 && (clearInterval(intervalId));
    }, 3000);

我为你做了jsfiddle

答案 5 :(得分:0)

for循环连续运行,因此每次调用都是该调用的3000毫秒。导致两次通话之间没有延迟。 为了更好地理解,在时间t和t + 1循环调用func1。因此它将在t + 3000和T + 3001执行,没有任何区别。

您可以尝试以下方法: -

function func1(i){
     setTimeout(function(){doSomething();}, i * 3000);
 }
for(i=i;i<=10;i++){
  func1(i);
}

注意: - 使用i = 1初始化循环。

答案 6 :(得分:0)

这是因为setTimeout()功能是非阻塞的。因此,setTimeout()功能仅在第一次运行。

试试这段代码......

var i = 1;
    function func1(){
        setTimeout(function(){
            doSomething();
            i++;
            if(i < 10){
                func1();
            }
        }, 3000);
    }
func1();