我有这个:
$.each(.., function() {
$(this).destroy() // call ajax
});
我想确保每个函数都已完成,并且ajax调用也是如此。
无论如何要做到这一点?我尝试了$.when
功能,但效果不佳。
ajax调用不是直接的,有一个函数让我成为一个ajax进程。 所以我需要在$ .ajax命令之外验证。
答案 0 :(得分:6)
您可以使用承诺:
var requests = [];
$.each(..., function() {
var promise = $.ajax(...);
requests.push(promise);
});
$.when.apply($, requests).done(function() {
// all AJAX requests completed here
}).fail(function() {
// will be called if any AJAX request failed
});
这就是说,我个人会避免在循环中进行许多类似的AJAX调用。制作一个大型AJAX呼叫而不是许多小型呼叫效率要高得多。
答案 1 :(得分:0)
最简单的方法可能就是使用async
$.ajax
参数简单地使所有ajax调用同步:
$.each(..., function(){
$.ajax({
url: "/script.php",
async: false
});
});
这样,在最后一个请求完成之前,你不会启动ajax请求,所以你知道一旦你的循环结束,所有的请求都将完成。
答案 2 :(得分:0)
不是很优雅,但应该有效:
var numCalls = 5, ajaxes = 0;
$.each(numCalls, function(i, v) {
$.ajax({
url: 'blah'
})
.always(function(){
ajaxes += 1;
checkDone();
});
});
function checkDone(){
if(ajaxes === numCalls){
doSomething();
}
}
答案 3 :(得分:0)
你可以让每个调用分配它对一个数组的承诺,一段时间之后检查所有数组元素已经完成
var jqxhr = [];
$.each(....
jqxhr.push($.ajax(......));
}); // end of each loop
使用
检查每个通话的状态$.each(jqxhr,function(idx,xhr) {
if (xhr.statuscode != 200) { ... }
});
答案 4 :(得分:0)
我不确定,如果您可以通过发送异步请求来实现此目的。但是,如果您使用同步请求很好,则需要添加async: false;
。
$.ajax({
//set properties
async: false;
//other properties
})
但是使用同步请求可能会导致浏览器等待并导致响应时间变慢。
答案 5 :(得分:0)
以下是另一种选择:使用ajaxStop
功能。
$.each(..., function(){
$.ajax(...);
});
$(document).ajaxStop(function(){
console.log("All done!");
}
绑定时,此函数检查已完成或取消的ajax请求(包括非jQuery请求),并在所有未完成的请求完成后触发回调。这允许您创建所需的所有异步Ajax请求,而无需更改实际请求的方式。
注意:如果在页面的其他位置同时进行ajax调用,则此方法也将等待这些调用。