setTimeout for循环(1次超时,然后一次循环)(双循环)

时间:2019-02-25 21:31:27

标签: javascript loops timer

我遵循了this post的答案,但是,这似乎对我不起作用。 我有第一个二维数组,我想在每个外部循环之间超时,而不是在外部循环中超时。

这是this Fiddle的摘要,显示了我从上述问题以及this one尝试的三种方法之一(请参阅案例1、2和3)。

    var data = [
                [
                    ["data[0][0]"],  
                    ["data[0][1]"]
                ],
                [
                    ["data[1][0]"],
                    ["data[1][1]"]
                ],
                [
                    ["data[2][0]"],
                    ["data[2][1]"]
                ]
            ];	

    var delay = 1000;
    
        function doSomething(i) {
    	setTimeout(function() {
      	for(let j = 0; j < data[i].length; j++) {
        console.log(data[i][j]);
        $('#result').html($('#result').html() + data[i][j]);
        }
      }, delay);
    }
    
    for(let i = 0; i < data.length; i++) {
    	doSomething(i);
    }
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <div id="result"></div>

关于该主题的更多问题/答案往往会产生相同的结果,所以我很茫然。

2 个答案:

答案 0 :(得分:2)

问题在于setTimeout的工作方式。它不是停止for循环的sleep命令。相反,它正在遍历初始的for循环,并大致同时启动三个计时器,每个计时器持续一秒钟。这意味着它们也几乎同时结束。

您可以通过执行以下类似操作来获得所需的结果(请注意i*delay上的计时器setTimeout。这样,您的第一个计时器为0ms,第二个为1000ms,第三个为2000ms ,那么您得到的结果却是错开的。

var data = [
  [
    ["data[0][0]"],
    ["data[0][1]"]
  ],
  [
    ["data[1][0]"],
    ["data[1][1]"]
  ],
  [
    ["data[2][0]"],
    ["data[2][1]"]
  ]
];

var delay = 1000;

function doSomething(i) {
  setTimeout(function () {
    for (let j = 0; j < data[i].length; j++) {
      console.log(data[i][j]);
      $('#result').html($('#result').html() + data[i][j]);
    }
  }, i*delay);
}

for (let i = 0; i < data.length; i++) {
  doSomething(i);
}
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    <div id="result"></div>

答案 1 :(得分:2)

此问题的另一种解决方案(使用递归思想)是实现一种方法,该方法在外部数组的1 second时每index对其进行调用,直到到达最后一次迭代(中断条件)为止等于他的长度:

var data = [
  [["data[0][0]"], ["data[0][1]"]],
  [["data[1][0]"], ["data[1][1]"]],
  [["data[2][0]"], ["data[2][1]"]]
];

function doSomething(i, delay)
{
    // Break condition.

    if (i >= data.length)
        return;

    // Print the inner array.

    data[i].forEach(x =>
    {
        console.log(x);
        $('#result').html($('#result').html() + x);
    });

    // Call to itself after some time to execute next iteration.

    setTimeout(() => doSomething(i + 1, delay), delay);
}

// Start the procedure.

doSomething(0, 1000);
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<div id="result"></div>