等待jQuery AJAX响应
我有一个页面,使用称为100次(async:true)的jQuery .ajax,问题是,当它们全部被加载时,我需要系统来在继续之前等待所有100个呼叫返回。我将如何去做这件事?等待jQuery AJAX响应
在此先感谢! :)
更新:
这些调用以虚构的()循环(有其中的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
});
您可以使用Deferred object api。只要$ .ajax返回延迟对象,您可以尝试使用以下代码循环:
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.');
});
P.S.有一篇关于使用延期对象的文章Eric Hynds Using Deferreds in jQuery 1.5
我更新了主要问题,如果我在for循环中创建所有Ajax调用,我仍然可以使用自己的方式吗? – Eax 2011-06-06 09:40:38
我更新了我的答案。 – 2011-06-06 09:45:59
这不起作用。如果您将除Deferred对象之外的任何其他对象传递给'$ .when'(包括包含延迟对象的数组),它将立即返回。你需要使用'$ .when.apply'来解决这个问题。 – lonesomeday 2011-06-06 10:34:23
100个Ajax调用?似乎是一个很奇怪的要求,可能很可能使用另一种方法来实现你要实现的目标:
var i = 0; function myCallback() { alert('Completed 100 times'); } function doAjax() { $.ajax({ url: 'blah.php', data: 'hello=world', success: function(response) { i++; }, complete: function() { if(i < 100) { doAjax(); } else { myCallback(); } } }); } doAjax(); // start
这种问题的数据库SQL设计无处不在作物起来 - 虽然它不是完全一样 - 的问题正是让你感觉到的事情:网络通信。
你需要小心,因为如果你做得不正确,它会回来咬你 - 也就是说,用户会因为等待而受到严重的懊恼。我无法强调这一点。
以下是该场景: 您希望根据请求从您的服务器传输许多小片段信息。 每个请求取决于许多有效运行的因素。所有这一切都在你的控制:
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)
知道了吗?
在本地机器上进行测试时,它可能会很好地工作。你甚至可能在同一台机器上运行你自己的数据库和网络服务器......但在野外尝试,不久就会遇到不可靠的问题。
听着,简单的事情要做的就是将所有参数合并到一个JS数组中并发送一个POST请求。然后在服务器上执行所有数据库选择并将响应汇总到一个JSON/XML响应中。
在这一点上,你只有等待一个AJAX响应。您可以在JSON/XML结果中找到所有数据。
鉴于您正在处理100个请求,您可能实际上可以使用秒表来衡量节省时间!
把它从我身上 - 做尽可能少的网络请求。
这些分开的ajax()调用还是您更改请求URL的地方? – 2011-06-06 09:31:58
我认为从http://stackoverflow.com/questions/6239333/preventing-submit-until-ajaxes-are-done的同样的解决方案可以为你工作。 – Niklas 2011-06-06 09:34:29
Matthew Riches:几个。 Niklas:谢谢:)我会考虑的! – Eax 2011-06-06 09:36:27