如何一次执行几个Ajax请求

我不确定它是否可以用JavaScript,所以我想我会问。 🙂

假设我们有100个要求要完成并希望加快速度。

我想做的是:

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

考虑到浏览器JavaScript不支持线程,我们可以“利用” asyncfunction吗? 你认为它会起作用,或者在JavaScript中存在固有的问题吗?

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

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

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

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

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

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

  1. 创建一个堆栈来存储您的作业(在这种情况下是请求)。
  2. 首先执行3或4个请求。
  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长度有限制,因此您发送的请求数量有限制。

DWR就是这样做的。