【发布时间】:2015-08-24 13:47:07
【问题描述】:
我正在尝试编写一个函数,它通过 x 步(本示例中的步骤 1、步骤 2)循环 x 次(本示例中为 3)x 秒(在本示例中,步骤 1 需要 2 秒,步骤 2需要 1 秒)。
所以我希望它循环如下:
第 1 步(2 秒) 步骤 2(1 秒) 第 1 步(2 秒) 步骤 2(1 秒) 第 1 步(2 秒) 第 2 步(1 秒)
我有下面的代码,但它只遍历循环一次,我不知道为什么。
jQuery('input').click(function () {
for(i = 0; i < 3; i++){
jQuery('div').html('Step 1');
setTimeout(function() {
jQuery('div').html('Step 2');
},2000);
setTimeout(function() {
jQuery('div').empty();
},2000 + 1000);
}
});
我希望循环以相同的时间继续,但在到达.empty(); 后返回开始。
JSFiddle:http://jsfiddle.net/kmyjhgvd/
【问题讨论】:
-
@Pablo 是正确的,这是一个显示他的意思的小提琴,打开控制台并查看日志触发 jsfiddle.net/kmyjhgvd/2
-
你为什么在这里使用 for 循环?如果您需要它是时间敏感的 AVOID 循环,请使用 RECURSION。递归方法可以根据布尔值/条件调用自身,然后重新开始。这将是更准确的计时器,(尽管即使在当今时代,计时器也会因循环和递归而失败)
-
-
@Pablo 没有充分的理由使用循环,因为它在运行时难以预测。一个循环可能会触发所有彼此非常接近的超时,或者在循环间隔之间滞后。在使用超时和间隔时,递归将为您提供更加统一的时间安排,请使用递归。
-
@Mike:你描述了一个循环不存在的问题,但递归确实存在。如果你使用递归,那么每次迭代的时间将取决于之前的所有,所以最后你积累了一个滞后。使用循环,所有超时都具有相同的起点,因此它们不会累积延迟。
标签: javascript jquery html for-loop settimeout