Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何执行Ajax请求,一次执行几个请求_Javascript_Jquery - Fatal编程技术网

Javascript 如何执行Ajax请求,一次执行几个请求

Javascript 如何执行Ajax请求,一次执行几个请求,javascript,jquery,Javascript,Jquery,我不确定这在JavaScript中是否可行,所以我想我会问: 假设我们有100个请求要完成,希望加快速度 我想做的是: 创建一个将启动前5个ajax调用的循环 等待它们全部返回(成功-调用函数更新dom/错误)-不确定如何返回,可能使用全局计数器 重复此操作,直到完成所有请求 考虑到浏览器JavaScript不支持线程,我们可以“利用”异步功能来实现这一点吗? 你认为它会工作吗,或者在JavaScript中这样做存在固有的问题?是的,我以前做过类似的事情。基本过程是: 创建一个堆栈来存储作业

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

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

我想做的是:

  • 创建一个将启动前5个ajax调用的循环
  • 等待它们全部返回(成功-调用函数更新dom/错误)-不确定如何返回,可能使用全局计数器
  • 重复此操作,直到完成所有请求
考虑到浏览器JavaScript不支持线程,我们可以“利用”异步功能来实现这一点吗?
你认为它会工作吗,或者在JavaScript中这样做存在固有的问题?

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

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

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

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

    所以,只要立即启动它们并信任浏览器即可

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


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

    实际上,在等待下一批请求完成之前,将100个请求拆分并一次批量发布5个请求会比较慢。您最好只发送100个请求,记住JavaScript是单线程的,所以一次只能解析1个响应

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

    /ajax_batch?req1=/some/request.json&req2=/other/request.json
    
    等等。基本上,您可以在一个HTTP请求中发送多个请求。此类请求的响应如下所示:

    [
       {"reqName":"req1","data":{}},
       {"reqName":"req2","data":{}}
    ]
    
    您的ajax\u批处理服务将解析每个请求,并按正确的顺序发回结果。客户端,您可以跟踪发送的内容和期望的内容,以便将结果与正确的请求相匹配。缺点是,它需要相当多的编码

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


    这个页面很贴切:它讨论了浏览器如何限制并发Ajax请求的数量,每个浏览器允许有趣的链接,谢谢。我假设浏览器暂时挂起超出限制的Ajax请求。要考虑的其他事情。但是,我不知道的是,如果浏览器以同步或异步方式挂起它(即,它是否在等待其他Ajax请求完成时锁定UI),请求将排队(即,直到另一个请求完成后才启动)。为了同步。请求时,浏览器将在队列和请求期间被锁定。对于异步,在这两个过程中都没有锁定。谢谢。这很有趣,如果我的后端是Java,它将是一个解决方案。但由于它是PHP,并且没有线程,所以我将在PHP上寻找一些伪线程实现。我希望避免这种情况。不需要实现伪线程,您只需在php服务中逐个批处理请求,并将结果输出为json/xml/任何形式。同样,速度的提高主要来自于减少http请求。我不确定我是否理解。如果后端脚本在5秒内完成1个任务,那么制作一个/ajax\u批处理脚本来顺序调用后端有什么好处?这不是5*5=25吗?对于后端脚本来说,5秒的时间听起来太多了。。。在任何情况下,每个请求的服务器往返通常比后端处理花费更长的时间。通过减少往返(即使异步重叠),您至少可以获得50%的速度增益。通过一次发送5个请求,你会失去速度,因为你摆脱了任何有益的并行请求,基本上也会在请求紧张的情况下陷入困境。让我这样说,如果浏览器在任何给定时刻最多运行10个并行请求,你可能会认为一次运行10个请求可能是一个解决方案,但您可能会忘记,如果请求完成,浏览器会从队列中弹出下一个请求。当您每次发送5个请求,并且仅在前5个请求完成时发送下5个请求时,您将丢失该队列弹出。因此,解决所有请求实际上需要更长的时间。通过将所有请求连接到一个请求中,您可以完全绕过队列,因为您只有一个http请求。因此,可以使用一个简单的循环来执行所有请求,并让浏览器自行处理限制/排队。听起来不错。:)谢谢。@john:没错:)至少先试试这个,看看它是否适合您的应用程序(服务器是否可以处理它,浏览器的并行请求限制是否符合您的使用场景)添加了php标记,因为它可能与一个好的解决方案有关。BGerrissen:好,PHP广泛用于web服务器端脚本等,但这个问题与PHP绝对无关@frunsi For Java DWR非常好地加快了并发Ajax请求的速度,必须有一个PHP等价物。因此,PHP最有意义的地方就是探索