2009-11-24 37 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