2012-12-12 55 views
0

我有一個while循環調用函數每秒:的setTimeout運行快速

function draw(){ 
     console.log(then-now) 
    }; 
var i = 0 
while(i < 100){ 
    setTimeout(draw,1000) 
    i++; 
}; 

但這不是等待每個調用之間的第二畫畫,它是調用它的100倍一次。

+1

這就是'while'語句的工作方式;他們多次運行他們的代碼。您的代碼正在創建100個超時。 –

回答

3

嘗試setInterval

function draw(){ 
    console.log(then-now) 
    i++; 
    if (i >= 100) clearInterval(interval); 
}; 
var i = 0 
var interval = setInterval(draw, 100); 

如果你想使用setTimeout,你必須從draw函數本身內部設置的下一次迭代。

function draw(){ 
    console.log(then-now) 
    i++; 
    if (i < 100) setTimeout(draw, 100); 
}; 
var i = 0; 
setTimeout(draw, 100); 

這是因爲setTimeout是異步的,所以你的while循環不會暫停 - 它一直走,幾乎瞬間發射的draw每個實例。

1
setTimeout(draw, 1000); 

應該是:

setTimeout(draw, 1000 * (i + 1)); 

這樣創建的每個超時1s更長。

i + 1是使得第一超時是1000,而不是0,如在0i啓動。

2

你似乎想

while(i < 100){ 
    i++; 
    setTimeout(draw, i*1000); 
}; 

注意setTimeout時間表爲未來的任務,但不等待 - 它立即返回,使你的代碼異步的。

但是,一次排列100個任務並不是一個好習慣。更好:

var i = 0; 
function draw(){ 
    console.log(then-now) 
    if (i<100) { 
     i++; 
     setTimeout(draw, 1000); // maybe adjusted to actual time 
    } 
}; 
draw(); 
+0

我不認爲一次創建100個超時是一個好方法。我有回調函數啓動後續超時。 –

+0

@ŠimeVidas:在您發表評論之前,我已經擴展了我的回答:-) – Bergi