2012-12-21 50 views
3

奇怪的概念性問題。下面的數組包含三個元素。當我運行此代碼時,我的意圖是腳本等待兩秒鐘,顯示警報,等待兩秒鐘,顯示警報,等待兩秒鐘並顯示最終警報。相反,它只是等待兩秒鐘,然後將所有三個警報背靠背地顯示出來。我一直在玩弄它一段時間,但找不到我想念的東西。有什麼建議麼?不重複的jQuery每個行爲

 $.each(node_array, function(index,value){ 
     if(value != undefined){ 
      setTimeout(function(){ 
      alert("hey")}, 
      2000) 
     } 
     }); 

回答

2

每迭代2秒鐘增加到您的延遲。

$.each(node_array, function(index,value){ 
    if(value != undefined){ 
     setTimeout(function(){ 
      alert("hey"); 
     },(index+1)*2000) 
    } 
}); 

的setTimeout是非阻塞的,因此代碼將繼續延遲經過之前運行,導致你發射了X的setTimeout的所有在同一時間以相同的延遲,所以他們都完成在同一時間。

+0

這是一個想法,但如果速度不夠快,警報之間不會有任何延遲。 –

+0

在我看來,這只是說明爲什麼警報不應該用於調試。 –

+0

在此我肯定同意。建立這個示範很痛苦。但是由於用戶閱讀和點擊提醒而導致的延遲與其他延遲(例如,ajax請求或事件)類似。 –

3

當您迭代時,您設置超時但您不停止迭代。所以所有的setTimeout都是同時啓動的。

你需要的是啓動下一個setTimeout用戶點擊警報後:

var i=0; 
function onestep(){ 
    alert('hey'); 
    var value = node_array[i]; 
    if (++i<node_array.length) setTimeout(onestep, 2000); 
} 
onestep(); 

Demonstration