2013-02-16 54 views
0

我搜索了周围,发现了一些其他类似的问题,但我似乎无法找到解决方案或明确的解释。setTimeout在循环中:回调发生在它们之间没有任何延迟

var content = 'test<br />'; 

for(var i = 1; i < 6; i++) { 
    setTimeout(function() { 
     document.write(content); 
    }, 3000); 
} 

我希望for循环中的代码执行5次,每个循环之间有3秒的延迟。当它运行时,至少在表面上看起来像是页面加载时的三秒延迟,然后毫不拖延地遍历所有循环。

我错过了什么?

+5

将3秒与计数器相乘。另外请注意,如果在页面加载后调用document.write – mplungjan 2013-02-16 18:59:29

+0

尽管javascript基于事件,但它有助于将'setTimeout'作为触发未来给定时间的事件,并将函数作为参数提供为该事件的处理程序(即使没有创建事件对象)。 – 2013-02-16 19:01:33

+1

*每个*回调函数都会在循环运行时执行3秒*。 mplungjan建议在3,6,9等时间调度一个秒。 – 2013-02-16 19:02:04

回答

4

您的问题是,所有的电话都在3000毫秒后发生。请执行每次呼叫3秒分开执行此操作:

var content = 'test<br />'; 

for(var i = 1; i < 6; i++) { 
    setTimeout(function() { 
     document.write(content); 
    }, 3000 * i); 
} 
+0

谢谢。我选择了这个答案,因为它只需要改变我已经拥有的代码。感谢所有在我的问题的评论中回答的人。 – Combobreaker 2013-02-16 19:19:20

2

您可能需要使用setInterval(因为你正试图在一定的‘区间’运行的代码)

// first create an isolated namespace because we don't need to dirty the global ns // 
(function(){ 
    var counter = 0; 
    var maxIterations = 6; 
    var intervalReference = setInterval(function(){ 

    // your code goes here // 
    alert('test'); 

    // the stop condition // 
    ++counter; 
    if (counter == maxIterations) { 
     clearInterval(intervalReference); 
    } 
    }, 3000); 
}()) 
+1

不,没有“可能需要”,虽然这是一个[复杂的方法] .. – 2013-02-16 19:05:36

0

setInterval不太可能去(见阿林的答案)的方式,但如果你是想要沿着setTimeout路线,代码会看起来像这样:

var loop = 0; 
var content = "test<br>"; 

function startTimeout(init){ 
    if(init!==true){ 
    document.write(content); 
    loop++; 
    } 

    if(loop<5){ 
    setTimeout(startTimeout, 3000); 
    } 
} 

startTimeout(true);