假设我有以下内容:
function main() {
var finished = false;
for(var i=0; i < 3; i++) {
do(i);
}
}
function do(i) {
$.ajax({
url:"myurl.com/"+i,
datatype:"text/xml",
success: function() {
// Two more layers of multiple nested $.ajax elements here
}
})
}
在三次迭代完成所有“do”后,是否有某种方法可以弹出一个警告框?怎么样?语法会有所帮助。
答案 0 :(得分:12)
ajax调用返回一个jQuery Promise对象。您可以在数组中收集每个输出,并使用$.when
将promises“捆绑”在一起。
此代码是您想要的基本理念:
function main() {
var finished = false;
var defs = [];
for(var i=0; i < 3; i++) {
defs.push(do(i));
}
$.when.apply(null, defs).done(function() {
//this code will only run when all ajax calls are complete
});
}
function do(i) {
var promise = $.ajax({
url:"myurl.com/"+i,
datatype:"text/xml",
success: function() {
// Two more layers of multiple nested $.ajax elements here
}
})
return promise;
}
浏览器可以有很多开放的HTTP连接,不要让反对者说服你。以下是浏览器支持的最大并发连接数表。让您的网站使用情况统计数据成为您的指南,但即使是2个ajax请求也会比完全同步的数据请求更快...
Firefox 2: 2
Firefox 3+: 6
Opera 9.26: 4
Opera 12: 6
Safari 3: 4
Safari 5: 6
IE 7: 2
IE 8: 6
IE 10: 8
Chrome: 6
答案 1 :(得分:2)
全球化:
var complete = 0;
所有AJAX电话;
$.ajax({
... //other attributes,
complete: function(){
complete++;
if (complete == 3) {
alert('all completed');
}
}
});
这将在完成三个AJAX调用时执行。但是,如果你需要增加它,那么就这样做。
答案 2 :(得分:0)
您可以使用一系列状态:
function main() {
var ready = new Array(3);
for (var i = 0; i < 3; i++) {
ready[i] = false;
}
for (var i = 0; i < 3; i++) {
do(i, ready);
}
}
function do(i, ready) {
$.ajax({
url:"myurl.com/"+i,
datatype:"text/xml",
success: function() {
// If there are multiple layers then the next statements should be executed in the last layer.
ready[i] = true;
if (isAllReady(ready)) {
alert("All done!");
}
}
})
}
function isAllReady(ready) {
var allReady = true;
for (var i = 0; i < 3; i++) {
if (!ready[i]) {
allReady = false;
}
}
return allReady;
}