2009-11-24 86 views
2

我的問題是:顯示與jQuery的延遲數據的每個循環

什麼是循環一些JSON數組也顯示出一些數據與 像一秒的延遲的最佳方式。

下一個不能正常工作,因爲它只能顯示一個消息一次而不是4個

jQuery.each(data.user, function(index, itemData) { 


    timerid = setTimeout(function(){showMessage(itemData);}, 1000); 
                 }); 

function showMessage(message){ 
    $('#status_info').html(message); 
    clearTimeout(timerid); 
} 

感謝,理查德

回答

3

如果你想避免使用setInterval並將調用限制在列表的長度上,您可以創建一個自我執行的函數來保存當前的索引,而不是使用閉包中的索引。閉包中的變量將始終是每個循環中的最後一個元素,因爲循環將在讀取setTimeout函數中的變量之前完成。

你也在調用clearTimeout函數,在這種情況下,這對我來說並沒有什麼意義。

最重要的是,你所有的setTimeout將會幾乎同時被調用。這會導致屏幕上的所有值閃爍幾毫秒(或在某些情況下太快而無法看到)。循環在這裏並不合適,因爲setTimeout函數是異步的。一個回調系統最適合有限次數的運行,而setInterval系統最適合未知數量的運行。對我來說,你的運行次數應該是你的jQuery對象中的元素數量(當前正在通過你的$ .each())的元素數量

我建議你做一些類似下面的問題的一般化例子(因爲我沒有訪問你的dom,所以一般化)。

function showMessage(message){ 
    $('body').html(message); 
} 

var itemData = [1,2,3,4]; 

var i = 0; 

function idTimer(list, i) { 
    if (!(i >= 0)) { 
    i= 0; 
    } 
    setTimeout((function(msg){ 
    i++; 
    return function(){ 
     if(i < list.length){ 
     idTimer(list, i); 
     } 
     showMessage(msg); 
    } 
    })(list[i]), 1000); 
} 

idTimer(itemData); 

這段代碼的現場演示,可以發現:http://jsbin.com/ifuqo

+0

謝謝你,我也是這樣做的。雖然沒有回調,但看起來很有趣。我已經設置了一個全局計數器和一個數組。在ajax函數中,我將數據推送到數組,並在接收到任何數據時設置setinterval()。 – Richard 2009-11-24 22:31:48

+0

遵循這種語法是相當困難的,但我會檢查出這個鏈接。 – Richard 2009-11-24 22:43:07

4

嘗試的setInterval來代替:

var i = 0; 
window.setInterval(function() { 
    $('#status_info').html(data.user[i++]); 
    i = i == data.user.length ? 0 : i; // loops the interval 
}, 1000); 
+0

謝謝,是neccasary使用窗口或會是一個變量太多或沒有?我更喜歡這個,因爲我可以理解語法。但是來自@Alex的人可能有更多優勢? – Richard 2009-11-24 23:01:37

+0

這取決於。 setInterval可能更適合這個任務,但它也是一個偏好問題。您還可以將間隔存儲在變量中,然後在需要停止間隔時將其清除。標準是使用window.setInterval(),但你可以省略窗口部分(不推薦)。請參閱:https://developer.mozilla.org/en/DOM/window.setInterval – David 2009-11-24 23:32:21