2

我的问题如下:

循环一些 json 数组的最佳方法是什么也显示一些延迟一秒的数据。

下面的一个不起作用,因为它只显示一条消息而不是 4

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


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

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

谢谢,理查德

4

2 回答 2

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);
于 2009-11-24T21:16:57.447 回答
3

如果您想避免 setInterval 并将调用绑定到列表的长度,您可以创建一个自执行函数来保存当前索引,而不是使用闭包中的索引。闭包中的变量最终将始终是每个循环中的最后一个元素,因为循环将在读取 setTimeout 函数中的变量之前很久就完成。

您还调用了 clearTimeout 函数,在这种情况下,这对我来说没有多大意义。

最重要的是,您的所有 setTimeouts 将几乎同时被调用。这将导致所有值在屏幕上以毫秒间隔闪烁(或者在某些情况下太快而无法看到)。循环在这里并不合适,因为 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

于 2009-11-24T21:58:29.150 回答