我有一个调用AJAX的javascript函数,如下所示:
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() {
});
在<script>
标记内。
答案 0 :(得分:1)
我认为你关于JS调用所有函数而不等待第一个函数完成的想法是正确的方向。这称为“异步请求”。有关详细说明,请参阅How to return the response from an asynchronous call?。
我们的想法是发送您的3个请求,然后等待所有请求完成,然后再检查squadron_counter
变量的值(或您在success
回调中更新的数据)。< / p>
然后,如果我的理解是正确的,你不知道如何实现这个等待?
由于您使用的是jQuery,因此实现非常简单。请注意,您的jQuery.ajax
request会返回Deferred object。因此,只需保留由您发送的每个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);
}
);