2015-02-24 44 views
2

我有需要执行多个AJAX一个页面请求 问题执行多个AJAX请求并行。该请求同时开始,但他们似乎等待其前任返回。无需等待别人来回应

可以说,page1需要大约3秒钟才能加载。第2页需要2秒加载。我得到的是,两者都在同一时间开始,page1请求在3个secons之后返回。

但问题是,5秒后页面请求返回。 这是为什么呢?我认为每个AJAX请求都会在它自己的线程中运行。那么为什么排队呢?为什么第二个人会等待第一个回应,甚至似乎开始呢?

如何管理发送请求和处理每个尽快到达应对?

$.ajax({ 
    type: "POST", 
    url: 'page1.php', 
    data: { } 
}) 
.done(function(data) {     
    console.log(data); 
}); 
$.ajax({ 
    type: "POST", 
    url: 'page2.php', 
    data: { } 
}) 
.done(function(data) {     
    console.log(data); 
}); 

我看到很多使用这种方法的例子。

$.when(
    $.get("/resource1"), 
    $.get("/resource2"), 
    $.get("/resource3") 
).done(function(response1, response2, response3) { 
// do things with response1, response2 and response3; 
}); 

但据我了解,它会尽快处理所有返回的响应。

对此有何意见?

+0

你需要添加一个额外的属性'async:true'。如果设置async:true,那么该语句将开始执行,并且将调用下一个语句,而不管异步语句是否已完成。 – Manoj 2015-02-24 09:07:28

+2

'async:true'是默认设置,不需要明确设置。 @Manoz – Jai 2015-02-24 09:08:18

+0

是的,这是真的,异步默认是真实的,我已经试过这个。 – ZSchneidi 2015-02-24 09:17:11

回答

2

给异步:真 的请求将被invidually处理!完成任何AJAX请求时

$.ajax({ 
      url: 'test.html', 
      async: true, 
      success: function (data) { alert(data); } 
     }); 
+0

正如在上面的评论中所说的,默认情况下,异步是真实的。 – ZSchneidi 2015-02-24 09:28:37

+0

响应秒数根据请求和响应大小而变化。异步仅适用于您是要同时还是一个一个地调用请求? – Ila 2015-02-24 09:38:35

4

你第一个代码示例保证运行的代码和CPU是免费使用。做不是忘记JS引擎是单线程而且队列 CPU空闲时要做的任务。

,如果你的第一完成AJAX请求(A1)需要10秒才能运行,在此期间,第二AJAX请求(A2)得到完成,A2必须等待,因为CPU正在处理中,A1的代码。

你可以找到在这个https://www.youtube.com/watch?v=8aGhZQkoFbQ更多细节。在本视频中,Philip Roberts描述了事件循环在浏览器中的工作方式。

+0

好吧,这很有趣。我会理解这一点,但要使用你的例子。如果A1需要10秒,并且可以说A2需要2秒,并且两者都是同时发送的,为什么A2在12秒后返回,而不是在A1返回后立即返回? – ZSchneidi 2015-02-24 09:33:56

+2

我在[这里](http://jsfiddle.net/fb1Lvbf6/2/)中创建了简单的示例。 A1加载需要10秒,A2需要2秒。看起来A2已经先完成了,8秒后A1完成。 – 2015-02-24 09:56:38

+0

我现在明白了一点。什么可能是这个问题的最佳解决方案?我如何设法同时加载耗时的零件? – ZSchneidi 2015-02-24 10:05:27

0

如果你正在使用PHP和基于文件的会话,你可能会被限制在每(PHP)第一个请求。您必须关闭会话才能同时处理多个请求。请参阅https://stackoverflow.com/a/8065977/1620112以获取解决方案。