如何一次执行几个Ajax请求
我不确定它是否可以用JavaScript,所以我想我会问。 🙂
假设我们有100个要求要完成并希望加快速度。
我想做的是:
- 创建一个循环,启动前5个ajax调用
- 等到它们全部返回(成功 – 调用函数来更新dom /错误) – 不确定如何,可能使用全局计数器?
- 重复,直到完成所有请求。
考虑到浏览器JavaScript不支持线程,我们可以“利用” async
function吗? 你认为它会起作用,或者在JavaScript中存在固有的问题吗?
我会说,Dancrumb的评论是这个问题的“答案”,但无论如何……
当前的浏览器确实限制了HTTP请求,因此您甚至可以轻松地立即启动所有100个请求,并且浏览器将尽可能快地发送这些请求,但仅限于相当数量的并行请求。
所以,立即启动它们并信任浏览器。
但是,这可能在未来发生变化(随着最终用户互联网带宽的增加和技术的进步,浏览器发送的并行请求数量也会增加)。
编辑 :您还应该在javascript上下文中思考和阅读“异步”的含义。这里异步只是意味着您放弃对系统其他部分的控制。 所以“发送”异步请求只是意味着你告诉浏览器这样做! 你不控制浏览器 ,你只是告诉它发送该请求,请通知我结果 。
是的,我之前做过类似的事情。 基本过程是:
- 创建一个堆栈来存储您的作业(在这种情况下是请求)。
- 首先执行3或4个请求。
- 在请求的回调中,将下一个作业弹出堆栈并执行它(给它相同的回调)。
实际上,分解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就是这样做的。