我有一个javascript函数,它调用AJAX,如下所示:
function addSquadronByID(id) {
$.ajax
({
type: "POST",
url: "server/get_squadron.php",
data: {
'id': id,
'counter': squadron_counter
},
cache: false,
success: function (data) {
squadron_counter++;
},
error: function () {
alert("AJAX error.");
}
});
}
}
在document.ready
之外,变量的初始化方式类似于var squadron_counter = 0;
当我在页面中调用它时,这个函数非常有效,但如果我尝试使用PHP在页面中编写它,就像这样:
$list_squadrons = $DB->Execute($query);
while(!$list_squadrons->EOF){
$currentSquadron_id = $list_squadrons->fields["squadron_id"];
$currentSquadron_number = $list_squadrons->fields["squadrons"];
echo "addSquadronByID($currentSquadron_id);'n";
$list_squadrons->MoveNext();
}
函数将正确的调用写入到document.ready()中,但即使函数有效,squadron_counter
也始终是zero
。我唯一的想法是,它是这样工作的,因为javascript一次调用所有函数,并且不会等到完成第一个函数后再执行第二个函数,等等。但我该如何解决这个问题呢?
请求的HTML输出:
addSquadronByID(3, squadron_counter);
addSquadronByID(5, squadron_counter);
addSquadronByID(6, squadron_counter);
这被放入
$( document ).ready(function() {
});
在CCD_ 5标签内。
我认为JS调用所有函数而不等待第一个函数完成的想法是正确的。这被称为"异步请求"。请参阅如何从异步调用返回响应?详细说明。
这个想法是发送您的3个请求,然后等待所有请求完成,然后检查squadron_counter
变量的值(或您在success
回调中更新的任何数据)。
那么如果我的理解是正确的,你不知道该如何实现这个等待吗?
由于您使用的是jQuery,因此实现非常简单。首先请注意,您的jQuery.ajax
请求返回一个Deferred对象。因此,只需保留由您发送的每个AJAX请求创建的Deferred对象的引用。然后,您可以使用例如jQuery.when
及其then
方法中的回调来等待所有请求完成:
function addSquadronByID(id) {
return jQuery.ajax({ /* ... */ }); // returns a Deferred object.
}
var d1 = addSquadronByID(3),
d2 = addSquadronByID(5),
d3 = addSquadronByID(6);
jQuery.when(d1, d2, d3).then(
// callback executed on success of all passed Deferred objects.
function () {
console.log(squadron_counter);
}
);
演示:http://jsfiddle.net/btjq7wuf/