0

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

这是没有同步的:

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

同步尝试:

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

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


这是我需要在 QUEUE 中运行的 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

3 回答 3

2

尝试这个:

var time = 500;
$.each(data, function(index, value) { 
  setTimeout(function() {
     alert(index + ': ' + value);
  }, time);
  time += 500;
});
于 2012-10-21T13:30:10.250 回答
1

根据您的评论:

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

回调方法很直观,也更容易实现,但是如果你有 100 个请求要发出怎么办?假设每个响应时间为 200 毫秒,总共为 20 秒。

那么问题来了:您真的关心 AJAX 调用的返回顺序,还是只需要按照您触发的调用顺序处理返回数据?

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

  1. 一次触发所有 ajax 调用(或在队列中)
  2. 维护一组返回数据
  3. 检查数组是否所有请求都已成功返回,如果有错误则重新请求(或其他错误处理机制)
  4. 当所有请求都返回后,做你原本打算的数据处理
于 2012-10-21T14:57:56.450 回答
1

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

var time = 500;
$.each(data, function(index, value) { 
  setTimeout(function() { alert(index + ': ' + value) }, time);
  time += 500;
});
于 2012-10-21T13:30:22.420 回答