暂停JQuery $ .each循环中的JSON项执行

时间:2010-12-19 02:13:23

标签: javascript jquery json

我遇到了jQuery的问题,通过JSOND调用远程数据。我想在数据集中的数组中的每个项之间暂停执行;我想下拉数据然后在每个项目之间暂停3秒钟,这样我就可以在隐藏它之前显示每个项目并继续下一个项目。

这是我正在努力实现的简化版本:

$.getJSON(someURL,function(data) {
   $.each(data.items,function(index,item) {
      setTimeout(function() { alert('found one!'); },3000);
   });
});

我遇到的问题是代码仅在3秒后运行setTimeout(),然后为集合中的每个项触发alert()对话框。因此,它在视觉上如此快速地穿过物品,只有最后一个物品可见。

有人可以指出我的错误在哪里吗?非常感谢! :)

3 个答案:

答案 0 :(得分:3)

问题是每个循环都在几毫秒内发生,所以基本上所有的setTimeouts总共相差1-2毫秒。

尝试乘以索引

setTimeout(function() { alert('found one!'); },3000 * index);

答案 1 :(得分:0)

每次触发后,每个setTimeout都会触发3秒,而不是按顺序触发。如果您希望它们按顺序出现,则需要在每次迭代data.items时增加该超时,或者在每次迭代后触发下一个超时。这是一个简单的重新工作。

$.getJSON(someURL,function(data) {
   var delay = 0;
   $.each(data.items,function(index,item) {
      setTimeout(function() { alert('found one!'); }, delay += 3000);
   });
});

当然警报会等待用户解雇它们,所以这个例子看起来仍然很奇怪,因为警报会每隔3秒钟就会消失......

答案 2 :(得分:0)

这种方式警告第一项,等待3秒,提醒第二项,等待3秒等。

$.getJSON(someURL,function(json){
  function doSomething(data){
    if(data.length>0){
      var curItem=data[0];
      alert('item: '+data[0]);
      setTimeout(function(){
        doSomething(data.splice(1));
      },3000);
    }
  }
  doSomething(json.items);
});