如果你想避免使用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
谢谢你,我也是这样做的。虽然没有回调,但看起来很有趣。我已经设置了一个全局计数器和一个数组。在ajax函数中,我将数据推送到数组,并在接收到任何数据时设置setinterval()。 – Richard 2009-11-24 22:31:48
遵循这种语法是相当困难的,但我会检查出这个链接。 – Richard 2009-11-24 22:43:07