在循环结束之前执行的循环内的AJAX调用

时间:2013-05-20 14:01:48

标签: javascript jquery ajax

我有以下问题:

我有一个循环:

// Code A
. . .
for (var key in dict){
    // Code B
    . . . 
    var list = this.initializeList();
    var selfRef = this;

    jQuery.ajax({
        dataType: 'json',
        url: '/someUrl',
        data: {'sent_data': sendData},
        success: function (recievedData){
            this.function(list);
        }
    });

    // Code C
    . . . 
}
// Code D
. . .

现在,理想的方法是执行代码的顺序是:

  1. 代码A
  2. for循环:
    • 代码B
    • AJAX
    • Code C
  3. 代码D
  4. 但是,问题出现在循环的第2步中:首先执行代码B ,然后执行AJAX调用,然后再执行AJAX代码而不是代码C 。在下一次迭代中,再次执行AJAX代码而不是代码B. 对我来说,执行顺序与上面列表中的显示非常重要。正如您所看到的,应该为每个循环重新初始化变量 list ,但是,我们只有第一次初始化时才会进行多次AJAX调用。

    我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

您需要使$.ajax()同步(而不是默认异步),如下所示:

$.ajax({
    ...
    async: false
}); 

这将导致脚本的执行等到$ .ajax结束,然后才继续执行脚本的其余部分。

我希望这有帮助!

答案 1 :(得分:3)

AJAX(因为它的名称声明它)是异步,这意味着它不按特定顺序执行。相反,一旦服务器响应初始调用,就会执行AJAX调用。你可以做些什么来纠正这个问题是在你的函数中添加一个延迟,或者在AJAX调用中添加一个回调,这样你就可以确保只在完成AJAX调用之后执行代码

将代码D放入回调中的示例:

// Code A  
...

//run Code D if loop exhausted
var dCheckCount = 0;
function dCheck() { // will be called once for each ajax call
  dCheckCount++;
  if (dCheckCount === dict.length) { // # finished ajax calls = loop size
    // Code D
    ...
  }
}  

for (var key in dict) {  
  // Code B
  ...

  jQuery.ajax({
    dataType: 'json',
    url: '/someUrl',
    data: {'sent_data': sendData},
    success: function (recievedData){
        this.function(list);
        // Code C
        ...

        // check if can run Code D
        dCheck();
    }
  });

}