我有一个页面,使用jQuery .ajax调用100次(async:true),问题是当它们全部加载完成后,我需要系统在继续之前等待所有100个调用都返回。我该怎么做?
谢谢!:)
更新:
这些调用是在for()循环中完成的(总共有100个:))
我有一个页面,使用jQuery .ajax调用100次(async:true),问题是当它们全部加载完成后,我需要系统在继续之前等待所有100个调用都返回。我该怎么做?
谢谢!:)
更新:
这些调用是在for()循环中完成的(总共有100个:))
使用 $.when
是更好的方法。您可以按如下方式使用:
$.when(
$.ajax({/*settings*/}),
$.ajax({/*settings*/}),
$.ajax({/*settings*/}),
$.ajax({/*settings*/}),
).then(function() {
// when all AJAX requests are complete
});
或者,如果你把所有的AJAX调用都放在一个数组里,那么你可以使用apply
:
$.when.apply($, ajaxReqs);
请注意,这需要至少jQuery 1.5。
要将AJAX请求添加到数组中,请执行以下操作:
var ajaxReqs = [];
for (var i = 0; i < 100; i++) {
ajaxReqs.push($.ajax({
/* AJAX settings */
});
}
$.when.apply($, ajaxReqs).then(function() {
// all requests are complete
});
Wide area Network reposnse time (anywhere in the world right?)
Locak area Network reposnse time (anywhere in the building)
WebServer Load
WebServer Response time
Database response time
Backend Script run time
Javascript run time to process the result
The fact that the browsers are generally limited to 6-8 parallel AJAX requests at once (I think - someone correct me on the exact number)
将请求乘以(嗯...在您的情况下乘以100)。
明白了吗?
在本地机器上测试可能会非常顺利。您甚至可以在完全相同的机器上运行自己的数据库和Web服务器...但在实际应用中尝试这样做,不久你就会遇到可靠性问题。
听着,最简单的方法是将所有参数都包装到一个JS数组中,并将其作为一个POST请求发送。然后在服务器端执行所有数据库选择,并将响应汇总到一个JSON/XML响应中。
此时,您只需等待一个AJAX响应。您可以在JSON/XML结果中找到所有数据。
考虑到您正在处理100个请求,您可能能够使用秒表实际测量时间节省!
相信我 - 尽可能少地进行网络请求。
var ajaxes = [];
for (i = 1; i < 100; i++) {
ajaxes[i] = $.ajax({/*data*/});
}
$.when.apply( ajaxes )
.then(function(){
console.log( 'I fire once all ajax requests have completed!' );
})
.fail(function(){
console.log( 'I fire if one or more requests failed.' );
});
PS:Eric Hynds撰写了一篇关于jQuery 1.5中如何使用延迟对象的优秀文章,您可以阅读Using Deferreds in jQuery 1.5
$.when
的不是一个 Deferred 对象(包括包含 Deferred 对象的数组),它会立即返回。你需要使用我的答案中提到的 $.when.apply
来解决这个问题。 - lonesomeday需要发起100次Ajax调用?这似乎是一个非常奇怪的需求,而您想要实现的目标很可能可以使用其他方法来实现:
var i = 0;
function myCallback() { alert('已完成100次'); }
function doAjax() { $.ajax({ url: 'blah.php', data: 'hello=world', success: function(response) { i++; }, complete: function() { if(i < 100) { doAjax(); } else { myCallback(); } } }); }
doAjax(); // 开始