默认情况下,AJAX是异步的,从jquery 1.8开始,不建议使用async:false。我不希望打破AJAX的异步属性。我在这里找到的大多数答案都说设置async false。那么什么是更好的方法呢?我想在所有循环完成后更新计数。
$.ajax({
url: "...",
success: function (objects) {
var count = 0;
for (var i = 0; i < objects.length; i++) {
logObject(object[i], count); // update count in every loop
}
console.log(count); // ALWAYS 0
}
});
function logObject(object, count) {
$.ajax({
url: "...",
success: function (result) {
console.log(object.item); // works fine
count+=result.count; // count increases everytime unless result.count is 0
}
});
}
答案 0 :(得分:0)
一种方法是在开始时递增计数器并在完成时减少,如下所示:
var activeAjaxConnections = 0;
.ajax({
beforeSend: function(xhr) {
activeAjaxConnections++;
},
success: function(resp) {
activeAjaxConnections--;
if (activeAjaxConnections === 0) {
// done.....
}
},
error: function(xhr, errDesc, exception) {
activeAjaxConnections--;
}
});
或者 - 更全球化 - 您可以使用:ajaxComplete
答案 1 :(得分:0)
首先,您将"count"
参数传递给函数并在此函数内更新它。它永远不会起作用,因为"count"
是一个基本类型,是整数,并且在函数"logObject"
中,您将使用"count"
的副本按值传递。
$.ajax({
url: "...",
success: function (objects) {
var count = 0;
for (var i = 0; i < objects.length; i++) {
logObject(object[i]).success(function(result){
count += result.count;
if((i + 1) === objects.length){
//Here you finished the loop
console.log(count);
}
}); // update count in every loop
}
}
});
function logObject(object) {
return $.ajax({
url: "..."
});
}