【问题标题】:How to perform Ajax requests, a few at a time如何执行 Ajax 请求,一次几个
【发布时间】:2010-11-21 22:43:27
【问题描述】:

我不太确定这在 JavaScript 中是否可行,所以我想我会问。 :)

假设我们有 100 个请求要完成并且想要加快速度。

我想做的是:

  • 创建一个将启动前 5 个 ajax 调用的循环
  • 等到它们全部返回(成功 - 调用函数来更新 dom / 错误) - 不确定如何,也许使用全局计数器?
  • 重复直到所有请求都完成。

考虑到浏览器 JavaScript 不支持线程,我们可以“利用”async 功能来做到这一点吗? 你认为它会起作用,还是在 JavaScript 中这样做存在固有问题?

【问题讨论】:

  • 添加了 php 标签,因为它可能与一个好的解决方案有关。
  • BGerrissen:好的,PHP 广泛用于 Web 服务器端脚本等,但这个问题绝对与 PHP 无关!
  • @frunsi 对于 Java DWR 可以很好地加速并发 Ajax 请求,必须有一个 PHP 等价物。所以 PHP 肯定是相关的,问题主要是“想要加快速度”,可能还有其他 PHP 开发人员可以帮助这个 PHP 开发人员。
  • 等等,我很困惑。那么每个客户端 Ajax 问题都应该用 PHP 标记吗?
  • @Juhana,不,在我的 awnser 的评论线程中,提到了后端的 PHP ;)

标签: javascript jquery


【解决方案1】:

是的,我以前做过类似的事情。基本流程是:

  1. 创建一个堆栈来存储您的作业(在本例中为请求)。
  2. 首先执行 3 或 4 个请求。
  3. 在请求的回调中,从堆栈中弹出下一个作业并执行它(给它相同的回调)。

【讨论】:

  • 此页面相关:stackoverflow.com/questions/561046/… 它讨论了浏览器如何限制每个浏览器允许的并发 Ajax 请求数
  • 有趣的链接,谢谢。我假设浏览器会暂时挂起超出限制的 Ajax 请求。还有其他要考虑的。然而,我不知道浏览器是同步还是异步挂起它(即,它是否在等待其他 Ajax 请求完成时锁定 UI)
  • 请求已排队(即在另一个请求完成之前不会开始)。对于同步。请求,浏览器将在队列持续时间内被锁定,并且请求。异步期间都没有锁定。
【解决方案2】:

我想说,Dancrumb 的评论是这个问题的“答案”,但无论如何......

当前的浏览器确实限制了 HTTP 请求,因此您甚至可以轻松地立即启动所有 100 个请求,浏览器会尽可能快地发送这些请求,但仅限于相当数量的并行请求。

所以,立即启动它们并信任浏览器。

但是,这在未来可能会发生变化(浏览器发送的并行请求数量会随着最终用户互联网带宽的增加和技术的进步而增加)。

编辑:您还应该思考并阅读 javascript 上下文中“异步”的含义。这里的异步只是意味着您放弃控制系统的其他部分。所以“发送”一个异步请求只是意味着你告诉浏览器这样做!您确实无法控制浏览器,您只是告诉它发送该请求并通知我结果

【讨论】:

  • 所以,一个简单的循环来执行它们并让浏览器自己处理限制/排队。听起来不错。 :) 谢谢。
  • @john: 确切地说 :) 至少先试试这个并检查它是否适用于您的应用程序(服务器是否可以处理它以及浏览器的并行请求限制是否适合您的使用场景)
【解决方案3】:

分解 100 个请求并一次批量发布 5 个请求实际上要慢一些,同时等待它们完成直到您发送下一批。最好只发送 100 个请求,记住 JavaScript 是单线程的,所以它一次只能解析 1 个响应。

更好的方法是设置一个批处理请求服务,它接受以下内容:

/ajax_batch?req1=/some/request.json&req2=/other/request.json

等等。基本上,您在单个 HTTP 请求中发送多个请求。此类请求的响应如下所示:

[
   {"reqName":"req1","data":{}},
   {"reqName":"req2","data":{}}
]

您的 ajax_batch 服务将解析每个请求并以正确的顺序发回结果。在客户端,您可以跟踪发送的内容和期望的内容,以便将结果与正确的请求相匹配。不利的一面是,它需要相当多的编码。

速度提升完全来自 HTTP 请求的大量减少。 您发送的请求数量有限制,因为 url 长度有限制 iirc。

DWR 就是这么做的。

【讨论】:

  • 谢谢。这很有趣,如果我的后端是 Java,这将是一个解决方案。但是因为它是 PHP 并且那里没有线程,所以我会在 PHP 上寻找一些伪线程实现。我希望避免这种情况。
  • 不需要实现伪线程,只需在一个php服务中批量处理请求,并将结果输出为json/xml/whatever。同样,速度提升主要可以通过减少 http 请求来获得。
  • 我不确定我是否理解。如果后端脚本在 5 秒内完成 1 个任务,那么制作将按顺序调用后端的 /ajax_batch 脚本有什么好处?不是 5*5 = 25 吗?
  • 5 秒听起来对于后端脚本来说是一个可怕的时间......无论如何,每个请求的服务器往返通常需要比后端处理更长的时间。通过减少往返次数(即使有异步重叠),您至少可以获得 50+% 的速度增益。通过一次发送 5 个请求,您会失去速度,因为您摆脱了任何有益的并行请求,并且基本上也会在请求应变之间暂停。
  • 让我这么说吧,如果浏览器在任何给定时刻最多运行 10 个并行请求,您可能认为一次运行 10 个请求可能是一个解决方案,但您会忘记,如果一个请求完成后,浏览器会从队列中弹出下一个请求。当您每次发送 5 个请求并且仅在前 5 个请求完成后才发送下一个 5 时,该队列弹出是您将丢失的。因此,解决所有请求实际上需要更长的时间。通过将所有请求连接成一个请求,您可以完全绕过队列,因为您只有 1 个 http 请求。
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多