等待jQuery AJAX响应

等待jQuery AJAX响应

问题描述:

我有一个页面,使用称为100次(async:true)的jQuery .ajax,问题是,当它们全部被加载时,我需要系统来在继续之前等待所有100个呼叫返回。我将如何去做这件事?等待jQuery AJAX响应

在此先感谢! :)

更新:

这些调用以虚构的()循环(有其中的100 :))

+1

这些分开的ajax()调用还是您更改请求URL的地方? – 2011-06-06 09:31:58

+2

我认为从http://stackoverflow.com/questions/6239333/preventing-submit-until-ajaxes-are-done的同样的解决方案可以为你工作。 – Niklas 2011-06-06 09:34:29

+0

Matthew Riches:几个。 Niklas:谢谢:)我会考虑的! – Eax 2011-06-06 09:36:27

的很好的方式做到这一点是$.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 
}); 
+0

得到爱jquery :) – melaos 2011-06-06 09:38:22

+2

Aaargh ...就在你认为你正在使用jQuery时,有一些新的东西。 – 2011-06-06 09:39:52

+0

我有一个for循环中的所有Ajax调用,那么如何将它们添加到数组呢? :) – Eax 2011-06-06 09:41:22

我不是JS的家伙,但我会创建一个全局变量,这将作为计数器,并定义一个定时函数来定期检查这个全局变量是否达到100。

编辑:的setTimeout()

+0

你是什么意思的定时功能? :) – Eax 2011-06-06 09:35:55

+2

忘记它,因为我看到你会得到更好的解决方案 – Damien 2011-06-06 09:38:00

您可以使用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

+0

我更新了主要问题,如果我在for循环中创建所有Ajax调用,我仍然可以使用自己的方式吗? – Eax 2011-06-06 09:40:38

+0

我更新了我的答案。 – 2011-06-06 09:45:59

+1

这不起作用。如果您将除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 
+0

我知道这很奇怪:) 我应该补充说,每个电话是不同的,并且我需要所有的返回数据。 – Eax 2011-06-06 09:42:26

+0

每种呼叫在哪种方式不同?不同的最终网址?不同的数据?很容易操纵我的答案以允许它并将返回的数据存储在另一个发送给回调函数的变量中。 – amustill 2011-06-06 09:50:37

+0

不同的数据:) 但我想它加起来是同样的事情,只需要改变数据。 – Eax 2011-06-06 10:37:34

这种问题的数据库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个请求,您可能实际上可以使用秒表来衡量节省时间!

把它从我身上 - 做尽可能少的网络请求。

+1

非常感谢你的一个非常详细的答案:) 然而,(总是其中之一,是不是?),我AJAX'ing实际上不是一个数据库,而是一个页面为特定的网站刮取信息。因此,我不能一次完成所有这100个请求,或者说,我可以,但这需要小时(我做过秒表测试;))而使用jQuery + Ajax运行时需要几分钟时间:) 再次感谢! – Eax 2011-06-06 10:27:18

+0

我不确定你是如何设法在*小时*内获得网页的?我已经使用CURL从以前的页面获取元数据。只需要花费时间为页面提供服务,所以你一定做了一些非常错误的事情。 – T9b 2011-06-06 15:19:20