【问题标题】:Waiting for jQuery AJAX response(s) [duplicate]等待 jQuery AJAX 响应 [重复]
【发布时间】:2011-09-09 03:38:40
【问题描述】:

我有一个页面,使用 jQuery .ajax 调用 100 次(异步:true),问题是,当它们都被加载时,我需要系统等待所有 100 个调用返回之前继续。我该怎么办?

提前致谢! :)

更新:

这些调用是在 for() 循环中进行的(有 100 个 :))

【问题讨论】:

  • 这些是单独的 ajax() 调用还是您更改请求 URL 的地方?
  • 我认为来自stackoverflow.com/questions/6239333/… 的解决方案同样适用于您。
  • Matthew Riches:有几个。 Niklas:谢谢 :) 我会调查的!

标签: ajax jquery jquery-deferred


【解决方案1】:

最好的方法是使用$.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
});

【讨论】:

  • 我在 for 循环中有所有的 Ajax 调用,那么如何将它们“添加”到数组中? :)
  • 谢谢!我认为这将是我正在使用的解决方案:)
  • 我可以问一下,我的“100”循环在另一个更大的循环中,这会在等待 Ajax 时暂停更大的循环还是继续? :)
  • 很棒的答案。最高分
【解决方案2】:

这种问题在数据库 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)

按要求乘以(呃……在你的情况下 x 100)

得到图片?

它可能在本地机器上的测试中运行良好。您甚至可能在完全相同的机器上运行您自己的数据库和网络服务器...但是在野外尝试一下,不久您就会遇到不可靠性问题。

听着,最简单的做法是将所有参数包装到一个 JS 数组中,然后在一个 POST 请求中发送。然后在服务器上执行所有数据库选择并将响应汇总到一个 JSON/XML 响应中。

此时您只需要等待一个 AJAX 响应。您可以在 JSON/XML 结果中找到所有数据。

鉴于您正在处理 100 个请求,您可能能够使用秒表实际测量节省的时间!

从我这里拿走 - 做尽可能少的网络请求。

【讨论】:

  • 非常感谢您提供非常详尽的答案 :) 但是,(总有其中一个,不是吗?),我 AJAX'ing 实际上不是数据库,而是取而代之的是一个抓取特定网站以获取信息的页面。所以我不能真正一次发出所有这 100 个请求,或者更确切地说,我可以,但这需要几个小时(我做了秒表测试;))然而,当使用 jQuery+Ajax 运行时,它需要几分钟 :) 再次感谢!
  • 我不知道您是如何在 小时 内成功获取网页的?我之前使用 CURL 从页面获取元数据也做过同样的事情。服务页面只能花费时间,所以你一定是做错了什么。
【解决方案3】:

您可以使用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.' );
   });

附: Eric Hynds Using Deferreds in jQuery 1.5 有一篇关于使用延迟对象的精彩文章

【讨论】:

  • 我更新了主要问题,如果我在 for 循环中进行所有 Ajax 调用,我还能使用你的方式吗?
  • 这行不通。如果您将 Deferred 对象以外的任何内容传递给 $.when(包括包含延迟对象的数组),它将立即返回。您需要在我的回答中使用$.when.apply 来解决这个问题。
  • 谢谢!你说得对,我错过了。
【解决方案4】:

100 次 Ajax 调用?似乎是一个非常奇怪的要求,而您尝试实现的目标很可能使用另一种方法来实现:

变量 i = 0; 函数 myCallback() { alert('已完成 100 次'); } 函数 doAjax() { $.ajax({ 网址:'blah.php', 数据:'你好=世界', 成功:功能(响应){ 我++; }, 完成:函数(){ 如果(我

【讨论】:

  • 我知道这很奇怪 :) 我应该补充一点,每个调用都是不同的,并且我需要所有返回数据..
  • 每个调用有什么不同?不同的结束网址?不同的数据?很容易操纵我的答案以允许这样做并将返回的数据存储在另一个变量中,该变量被发送到回调函数。
  • 不同的数据 :) 但我想它加起来是一样的,只需要改变数据。
【解决方案5】:

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

编辑:setTimeout()

【讨论】:

  • 定时函数是什么意思? :)
  • 算了,我看你会得到更好的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多