我有以下问题:
我有一个循环:
// 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
. . .
现在,理想的方法是执行代码的顺序是:
但是,问题出现在循环的第2步中:首先执行代码B ,然后执行AJAX调用,然后再执行AJAX代码而不是代码C 。在下一次迭代中,再次执行AJAX代码而不是代码B. 对我来说,执行顺序与上面列表中的显示非常重要。正如您所看到的,应该为每个循环重新初始化变量 list ,但是,我们只有第一次初始化时才会进行多次AJAX调用。
我该如何解决这个问题?
答案 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();
}
});
}