强制队列在.each()(javascript)

时间:2012-10-21 13:26:40

标签: javascript jquery asynchronous

如何在javascript循环中强制同步?

这是没有同步的:

$.each(data, function(index, value) { 
  alert(index + ': ' + value); 
});

同步尝试:

var time = 500;
$.each(data, function(index, value) { 
  setTimeout(alert(index + ': ' + value), time);
  time += 500;
});

但到目前为止它所做的只是连续运行警报,没有间隔


这是我需要在队列中运行的ajax请求:

        $.each(data, function(key, val) {

            $.ajax({      
            url: 'ajax/getPerson.php', 
            type:'post',
            dataType: 'json',
            data: { 'dude' : val["idG"] },
            success: function(data) { createHTML.person(data) }
        }

4 个答案:

答案 0 :(得分:2)

试试这个:

var time = 500;
$.each(data, function(index, value) { 
  setTimeout(function() {
     alert(index + ': ' + value);
  }, time);
  time += 500;
});

答案 1 :(得分:1)

将您要在function()对象中执行的代码作为第一个参数传递给setTimeout(),如下所示:

var time = 500;
$.each(data, function(index, value) { 
  setTimeout(function() { alert(index + ': ' + value) }, time);
  time += 500;
});

答案 2 :(得分:1)

根据你的评论:

  

我正在使用此函数发出数据库请求,但它们没有按照我要求的顺序返回

回调方法直观且易于实现,但如果您有100个请求,该怎么办?假设每个响应时间200ms,总共20秒。

所以这就是问题:您是否真的关心AJAX调用的返回顺序,或者您只需要按照已触发的调用顺序处理返回的数据?

如果答案是后者,解决方案将是:

  1. 立即(或在队列中)触发所有ajax呼叫
  2. 维护一组返回数据
  3. 检查数组是否已成功返回所有请求,如果出现错误(或其他错误处理机制)则重新请求
  4. 当返回所有请求时,执行您原先想要的数据处理

答案 3 :(得分:0)

Found a good answer on a similar issue using callbacks: 

stackoverflow.com/a/4797596/1064717