2011-04-23 121 views
2

這是類似於「回答」的問題
JQuery AJAX request behaving synchronous for unknown reasonJQuery的AJAX請求行爲同步

我相信,通過觀察MGM並行執行的實際問題一直被忽視,實際上沒有與不用彷徨$ /問題$ .ajax並行執行。

看看下面的代碼片段:

$(function() { 
    $(".dd").each(function() { 
     var obj = $(this); 
     $.get("test.txt", function(data) { 
      obj.html(data); 
     }); 
    }); 
}); 

它加載一個文件(異步我所期望的),並將其顯示(同步的課程)。

但是,在首次加載頁面和刷新頁面時,代碼的執行方式不同。我在Windows上使用Firefox 4.0中的Firebug Net面板監視對服務器的請求。在第一次加載頁面時(或使用Ctrl-F5刷新時),我可以在網絡面板上看到,同時啓動對「test.txt」的多個請求,並且網絡活動主要重疊。

該零件按預期工作。結果可能會在瀏覽器中逐個處理,但對服務器的請求是並行執行的。

image:initial load

它是完全地不同的故事,當用戶按下F5刷新頁面。突然間的並行性消失了。同一個網頁逐一加載「test.txt」。

image: Subsequent refresh

如果我替換數據顯示(obj.html(數據))變得更加清楚用一個簡單的警報:警報(數據);在初始頁面加載時,我同時在屏幕上顯示多條警報消息。後續刷新(F5)清楚地表明,雖然屏幕上有一條警報消息,但不會執行其他下載(我可以刪除該文件以查看下一個「$ .get」失敗)。

所以實際上$ .get不執行異步。調用服務器。

關於爲什麼會發生這種情況的任何想法?

P.S.對不起系統不允許我發佈圖片使用提供的URL來查看截圖。

+1

您正在混淆異步和並行執行。異步意味着瀏覽器在等待服務器請求時不會阻塞。瀏覽器實例是單線程進程,它不能並行執行任何操作。警報始終是阻止呼叫,所以當警報框啓動時它當然不能下載任何內容。初始加載和刷新之間的區別可能在於瀏覽器在刷新時重新驗證其緩存,這是它應該執行的操作。嘗試使用帶有大量.dd列表的$ .ajax({sync:true})調用,您將看到瀏覽器凍結。 – EMI 2011-04-23 17:14:38

+0

「瀏覽器實例」 - 不確定你所指的是什麼,但瀏覽器是多線程的。 JavaScript執行始終在單個線程中執行。你是對的。 Alert是瀏覽器的實現,儘管它阻止了JavaScript的執行,但它不必阻止瀏覽器處理。 – ads 2011-04-23 18:52:11

+0

在初始頁面加載過程中,當屏幕上顯示第一條警報時,將處理所有請求並加載文件。如果我在屏幕上顯示第一條警告時刪除文件,我不會收到任何錯誤並可以看到其他警報。 (舊版瀏覽器的行爲是不同的,並且警報實際上可以阻止所有內容) – ads 2011-04-23 18:52:41

回答

0

經過各種測試後,我傾向於同意$ .get/$。ajax按預期的方式異步工作。

只要服務器不立即響應,但需要一些時間來處理請求,相同的代碼完全異步工作。 由於服務器上出現人爲延遲,服務器上收集的日誌顯示請求並行進行,無論它是初始頁面加載還是後續刷新。 Firebug顯示相同:對服務器的呼叫重疊。

較短的請求似乎太快,並且瀏覽器在決定啓動下一個呼叫之前「決定」處理響應。

如前所述,異步並不意味着完全平行。