我遵循了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>
关于该主题的更多问题/答案往往会产生相同的结果,所以我很茫然。
答案 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>