2015-02-24 50 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以獲取解決方案。