0

我有以下问题:

我有一个循环:

// 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
    • 代码 C
  3. 代码 D

但是,问题出在循环的第 2 步:首先,执行Code B,然后是 AJAX 调用,然后再次执行 AJAX 代码而不是Code C。在下一次迭代中,再次执行 AJAX 代码而不是代码 B。对我来说,执行顺序如上表所示非常重要。正如你所看到的,变量列表应该为每个循环重新初始化,但是,我们有多个 AJAX 调用,只有第一次初始化。

我该如何解决?

4

2 回答 2

5

您需要像这样使$.ajax()同步(而不是默认的异步):

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

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

我希望这有帮助!

于 2013-05-20T14:07:18.753 回答
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();
    }
  });

}
于 2013-05-20T14:05:41.830 回答